先上題目
題目描述 description
有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30),每個物品有乙個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
輸入描述 input description
乙個整數v,表示箱子容量
乙個整數n,表示有n個物品
接下來n個整數,分別表示這n 個物品的各自體積
輸出描述 output description
乙個整數,表示箱子剩餘空間。
樣例輸入 sample input
樣例輸出 sample output
首先我們來思考一下
我們要求的就是怎樣讓這個揹包裡面裝的東西最多,即就是去求最優解的問題。
然後我們就可以定義乙個陣列,讓陣列下標作為箱子的容量,並求該容量下最大能放多大體積的物品,並將值給 f[j],那麼 f [j] 的值就是容量為 j 時最大能放多少體積的物品,然後每次的計算就會有兩個方向,即就是 f[j - a[i]] + a[i] 與 f[j] 的比較。
這裡我們假設就是每個f[j] 存的都是在當前狀態下當容量為 j 時所能放入的最大體積舉個例子 ,當前j = 10 , i = 6; f[10] = 8 , f[5] = 4 ,a[i] = 5;
這個時候我們就要進行選擇,是直接將原本在 j = 10下最多能放 8 體積的值給現在的 f[10], 還是將 5 ( a[i] ) 和 4 ( f[5] )的值
賦給 f[10],顯然後者的值要大於前者
int
main
(void
)for
(i =
0; i < n;
++i)}}
printf
("%d"
,v - f[v]);
// f[v] 即就是在 j 為 v 時的最大能放的體積 ,
//用輸入的體積減去該體積即為所求體積
return0;
}
Dp基礎 簡單揹包問題
揹包問題大意 給你乙個揹包有一定的容量,再給你一下些物品,物品有自己的體積和價值,請你選擇價值和最大的一些物品 最體積不超過揹包的容量 揹包問題思路 逐漸放每乙個物品,找到當前體積的最大價值。揹包問題的主要 for i 1 i n i 逐漸放乙個物品 for j m j w i j 列舉揹包放下這個...
DP 揹包問題
大牛 以下使用滾到陣列 若輸入要求一般,可以邊定義狀態邊輸入,不需儲存 memset f,0,sizeof int n 若求最小值,除 f 0 其餘初始化為 inf,f 0 0是必須的 求最大最小都一樣 確保有從無到有的起點 0 1揹包 一般形式 f i v max f i 1 v f i 1 v ...
揹包問題 DP
01揹包 現在有1個體積為mmax的揹包和n種物品 每種物品只有1個 每種物品的體積和價值分別是v i 和w i 求這個揹包最多可以裝價值多少的物品。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 設f i j 表示前i件物品恰放入乙個容量為j的揹包可以獲得的最大...