开门见山 ╰(*°▽°*)╯
我P某人要开讲了~
dp[n][v]状态定义为:选择前n个物品的若干个装入体积为v的包中 ,所能获得的最大价值
那么有对于当前的状态,我们有 dp[n][v]=max(dp[n-1][v],dp[n-1][v-w[n]]+v[n]]
接下来叙述一个问题 : 01背包恰好装满 与 不要求恰好装满
1.若为恰好装满
要恰好装满,对于dp数组的初始化有所不同,很显然有些状态不能恰好装满,其中有dp[0][1~v]=dp[1~n][0]-无穷 dp[0][0]=0 再进行DP。 NOW只求会用,想知道证明原理的可以到百度上搜索
2.无需恰好装满
无需恰好装满,memset(dp,0,sizeof(dp)) 就哦开la ~ (๑•̀ㅂ•́)و✧ !!!
再叙述一个问题:01背包时间与空间优化问题
1.空间优化
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
if(j>=w[i]) dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
2.时间优化
初级优化
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
高级常数优化
for(int i=1;i<=n;i++){
if(i>1) sum-=w[i-1];
int lim=max(n-sum,w[i]);
for(int j=m;j>=lim;j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
欧凯·-· 就这么多!
2018.1.19 凌晨1:07
晚上睡不着觉,打开BLOG开始学习
输出DP路径
void traceback(){ for(int i=n;i>1;i--){ if(m[i][c]==m[i-1][c]) x[i]=0; else{ x[i]=1; c-=w[i]; } } x[1]=(m[1][c]>0)?1:0; }