经典动态规划
(更新中...)
1.0-1背包
问题描述:给定num种物品和一个容量为c的背包,每种物品的体积是w,其价值为v,如何使选择装入背包内的物品,使得装入背包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。
例:num=4 c=8
物品i 体积w[i] 价值V[i]
1 3 3
2 3 4
3 4 5
4 5 6
问题分析:对于每个物品有两种方法,能装下和不能装下
(1) 当前包的剩余容量小于该商品体积,装不下,状态转移方程为
dp[i][j]=dp[i-1][j] //其中i为第i个物品,j为背包当前剩余容量
(2) 当前背包的剩余容量大于该商品体积,能装下
dp[i][j]=max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]) //在不装与装之间选择一个最优,dp[i-1][j-w[i]]+v[i]表示前i-1种物品中选取若干件物品放入剩余空间为j-w[i]的背包中所能得到的最大价值加上第i种物品v[i];
状态转移表:
代码:
1 #include <iostream> 2 #include<algorithm> 3 using namespace std; 4 5 //建议定义一个较大数组,new的方式较为麻烦,还需要初始化边界条件 6 int w[105], val[105]; 7 int dp[105][1005]; 8 9 int main() 10 { 11 int t, num, res = -1; 12 cin >> num >> t; 13 for (int i = 1; i <= num; i++) 14 cin >> w[i] >> val[i]; 15 for (int i = 1; i <= num; i++) //物品 16 for (int j = 1; j<=t; j++) //容量 17 { 18 if (j >= w[i]) //容量大于当前物品体积 19 dp[i][j] = max(dp[i - 1][j - w[i]] + val[i], dp[i - 1][j]); 20 else 21 dp[i][j] = dp[i - 1][j]; 22 } 23 cout << dp[num][t] << endl; 24 return 0; 25 }