Problem P08. [算法课动态规划]背包问题
一个背包有一定的承重 c,有 N 件物品。设数组下标从 11 开始。每件物品都有自己的价值,记录在数组 V 中,也都有自己的重量,记录在数组 W 中,每件物品只能选择要装入还是不装入背包,要求在不超过背包承重的前提下,选出的物品总价值最大。输出能装入背包的物品的最大总价值。
输入
输入一行两个整数物品数量 N(1≤N≤500) 承重 c(1≤c≤500)。
接下来输入一行 N 个整数,第 i 个整数代表 Wi(1≤Wi≤500)。
接下来输入一行 N 个整数,第 i 个整数代表 Vi(1≤Vi≤106)。
输出
一行一个整数,代表最大总价值。
样例
标准输入复制文本 |
4 10 7 3 4 5 42 12 40 25 |
标准输出复制文本 |
65 |
提示
对样例,物品数量为N=4,背包承重为 c=10 每个商品重量为 W=[7,3,4,5],价值为 V=[42,12,40,25],选择最后两个物品,重量为 99,价值为 40+25=6540+25=65,没有任何其他方案总价值更高。
可以动态规划方法求解。
分析两种情况:
- 第 i 个物品放不进去背包:Wi>j ;
- 可以放进去,但是可以选择放进去或者不放:Wi≤j;
#include<iostream> #include<algorithm> using namespace std; const int N = 1010; int num, m; int weight[4] = { 7,3,4,5 }; int value[4] = { 42,12,40,25 }; int f[N][N]; int main() { cin >> num >> m; int j; for (int i = 1; i <= num; i++) { for (int j = 0; j <= m; j++) { f[i][j] = f[i - 1][j]; if (j >= weight[i]) f[i][j] = max(f[i][j], f[i - 1][j - weight[i]] + value[i]); } } cout << f[num][m] << endl; return 0; }