对于给定的背包体积V;
选择若干个物品,使得总体积不超过V的前提下总价值最大->求这个价值。
体积:8 5 5
价值:1 1 1
①直接贪心体积小的X
②直接贪心价值大的X
③直接贪心性价比高的X
直接贪性价比:
体积:8,5,5;
价值:16,9,9;
选5,5的价值>选8的价值。
假设你已经知道了前i-1种物品在对应体积下可以获得的最大价值,那么对于第i种物品要考虑->体积V&&价值Value.
不带某物品:
dp[i(物品)][j(体积)]=dp[i-1][j];
二维数组(物品&时间限制)
当前物品限制下&当前时间限制下保证最大价值
状态转移方程:
1.没时间采: dp[i][t]=dp[i-1][j];
2.有时间采,则比较价值:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-ti]+v);
一维数组
其实,第j位的答案只和第j-t位的答案有关系,for循环从后往前写.
状态转移方程: dp[j]=max(dp[j],dp[j-t]+v);
time:3 value:5
0 1 2 3 4 5 6 7 8 9 10
0 0 0 5 5 5 10 10 10 15 15
动态转移方程:
二维: dp[i][j]=max(dp[i-1][t],dp[i][j-t]+v);
一维: dp[j]=max(dp[j],dp[j-t]+v);
01背包 max(dp[i-1][j],dp[i-1][j-t]+v);
无限背包 max(dp[i-1][t],dp[i][j-t]+v);
二维数组(体积,重量)
动态转移方程:
动态转移方程:
V:3&5;
1->true;0->false;
0 1 2 3 4 5 6 7 8 9 10
1 0 0 1 0 1 0 0 1 0 0
假如不用:让前一个得到true;
假如要用:可以什么都不选;
动态转移方程:dp[j]=dp[j]||dp[j-v];
码字不易,求您高抬贵手,给个赞再走吧