算法訓練 裝箱問題


問題描述
  有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。
  要求n個物品中,任取若干個裝入箱內,使箱子的剩余空間為最小。
輸入格式
  第一行為一個整數,表示箱子容量;
  第二行為一個整數,表示有n個物品;
  接下來n行,每行一個整數表示這n個物品的各自體積。
輸出格式
  一個整數,表示箱子剩余空間。
   樣例輸入
  24
  6
  8
  3
  12
  7
  9
  7
樣例輸出
0
思路:類似於0-1背包,得:dp[v1] = max{dp[v1],dp[v1-v[i]]+v[i]}//第i個物品未被選上或被選上

其中dp[v1]表示容量為v1的箱子能夠獲得的最大物品體積(價值)
用V-dp[V]即是最終答案
同時,用滾動數組可省去定義v[n]的空間

#include <stdio.h>
int dp[20001];
int GetMax(int a ,int b)
{
    return a > b ? a : b;
}
int main()
{
    int V,n,i,t,v;
    scanf("%d%d",&V,&n);
    for(t=0;t<n;t++)
    {
        scanf("%d",&v);
        for(i=V;i>=v;i--)//從后往前遞推
            dp[i] = GetMax(dp[i],dp[i-v]+v);
    }
    printf("%d\n",V-dp[V]);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM