題目描述:
有乙個箱子容量為 v,同時有 n 個物品,每個物品有乙個體積(正整數)。
要求 n 個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
輸入格式
第一行是乙個整數 v,表示箱子容量。
第二行是乙個整數 n,表示物品數。
接下來 n 行,每行乙個正整數(不超過10000),分別表示這 n 個物品的各自體積。
輸出格式
乙個整數,表示箱子剩餘空間。
資料範圍
0輸入樣例:
2468
31279
7
輸出樣例:
0
分析:
本題可以用dfs來搜尋解,每個物品裝與不裝,但是使用動態規劃更為簡單。關鍵在於兩步轉化,第一步,箱子的剩餘空間最小等價於裝進箱子的物品體積最大;第二步,將物品的體積看作01揹包問題的價值。即f[i][j]表示前i個物品中選擇體積不超過j的裝進箱子裡物品體積最大值。狀態轉移方程為f[i][j] = max(f[i-1][j],f[i-1][j-v]+v)。
#include #include using namespace std;
const int n = 32,m = 20005;
int f[n][m],v[n];
int main()
}printf("%d\n",m - f[n][m]);
return 0;
}
同樣可以使用滾動陣列來實現。
#include #include using namespace std;
const int n = 32,m = 20005;
int f[m],v[n];
int main()
}printf("%d\n",m - f[m]);
return 0;
}
問題A 裝箱問題
思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...
Codeup 問題 A 裝箱問題
問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,第2個數表示有n件物品,後面n個數分別表示這n件 物品各自的體積。輸出 1個整數,表示箱子剩餘空...
練習 問題 A 裝箱問題
問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,第2個數表示有n件物品,後面n個數分別表示這n件 物品各自的體積。輸出 1個整數,表示箱子剩餘空...