01揹包的特徵在於某樣物品只有乙個,你要麼取它,要麼不取它,只有兩種狀態。(同一種物品不會有很多個,你只能有0個或1個,而不能有3、4、5、6……個)
01揹包模板題,就是當前骨頭取與不取的抉擇問題,選擇收益最大的那個即可。
需要注意的是,揹包的容量要從0開始列舉到v,如果從1開始列舉會wa,可能是資料含有一些骨頭,占用的空間為0。(然而這在現實中並不可能)題意只說了給出的資料的上界而沒有說下界,這樣並不好。
如果將二維陣列優化為一維陣列,注意內層迴圈的方向發生了改變,變成了從後往前。
要改變迴圈方向的原因是,我們當前狀態是**於上一行狀態的,如果迴圈是正向的,我後面要用到上次的狀態的時候,可能前面的把它修改掉了,這樣我們的答案就會錯誤。
二維陣列
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e3+10;
int bone_val[maxn]
;int bone_room[maxn]
;int dp[maxn]
[maxn]
;//01揹包
//dp[i][j] 表示i個物品,容量為j時,能放入的最大的骨頭價值
intmain()
return0;
}
能夠優化成一維陣列
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e3+10;
int bone_val[maxn]
;int bone_room[maxn]
;int dp[maxn]
;//01揹包
intmain()
return0;
}
hdoj 2602 01揹包入門題
其實這幾篇有的是之前寫的,但是在家裡不知道怎麼回事csdn一直上不去,於是來了學校順便整理下。第一道01揹包用了二維的方法解,二維的就是要注意在遍歷揹包容量時要從零開始,並且判斷是否大於該物品的消耗,如果大於的話在考慮是否放入,否則直接就是不能放。include includeint f 1010 ...
hdu1171 多重揹包模板題
最近重新開始學dp,今天做到多重揹包這題,自己寫了乙個 感覺自己確實進步點了 嘻嘻。但是我沒看清題意n 0 退出迴圈,我wa 了無數次。下 面是自己寫的 include include include include include include include include include i...
HDU 1059 多重揹包模板題
題意 有價值為1,2,3,4,5,6的物品,每種物品都有一定數量,問這些物品能不能平分成價值相同的兩份 思路 多重揹包模板題,以價值總額的一半為揹包容量 include include include include include include include include include i...