完全背包--动态规划

一)模板题:完全背包

【模板】完全背包_牛客题霸_牛客网 (nowcoder.com)

完全背包--动态规划_第1张图片

完全背包--动态规划_第2张图片 

第一问:

一)定义一个状态表示: 

dp[i][j]表示从前i个物品中选,总体积不超过j,所有选法中,最大的价值

二)根据状态标识推到状态转移方程:根据最后一个位置的状态来划分问题

之前做01背包问题的时候我们i位置的值是可以选也是可以不选的,但是在多重背包里面,最有一个位置的值可以不选,可以选择1个,可以选择2个,还可以选择多个,所以说此时可以进行讨论的情况就变得非常多,只要背包能放得下,那么我就可以无限选

1)如果我进行挑选i位置的礼物1个,那么我们只需要去0到i-1区间内去寻找j-v[i]的最大价值即可,if(j-v[i]>=0) dp[i][j]=dp[i-1][j-v[i]]+w[i](你所进行挑选的礼物不能超过j)

2)如果我们挑选i位置的礼物2个,那么我们只需要去找0-i-1区间去寻找j-2v[i]的礼物的最大价值即可,if(j-2*v[i]>=0) dp[i][j]=dp[i-1][j-2v[i]]+2*w[i];

3)如果挑选i位置的礼物3个,dp[i][j]=dp[i-1][j-3v[i]+2*w[i];

所以最终的状态转移方程就是dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-k*v[i]]+k*w[i])

完全背包--动态规划_第3张图片

上面的状态转移方程的终极状态就是j-kv[i]和j-xv[i]要无限接近等于0,所以k=x

 完全背包--动态规划_第4张图片

完全背包--动态规划_第5张图片 

 

 

你可能感兴趣的:(动态规划,算法)