专题-经典动态规划

经典动态规划

(更新中...)

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 }

猜你喜欢

转载自www.cnblogs.com/XZDSF/p/11303727.html
今日推荐