AcWing 1024 裝箱問題

2021-10-02 08:24:48 字數 983 閱讀 2057

題目描述:

有乙個箱子容量為 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個整數,表示箱子剩餘空...