给定n种物品(每种仅一个)和一个容量为c的背包,要求选择物品装入背包,使得装入背包中物品的总价值最大。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入3行,第1行为两个整数n(1≤n≤400)和c (1≤c≤1500),分别表示物品数量与背包容量,第二行为n个物品的重量wi(1≤i≤n),第三行为这n个物品的价值vi(1≤i≤n)。物品重量、价值都为整数。
输出格式:
对于每组测试,在一行上输出一个整数,表示装入背包的最大总价值(结果保证在231−1范围内)。
输入样例:
4 9
2 3 4 5
3 4 5 7
25 100
42 6 48 13 38 124 8 17 41 25 41 26 47 41 171 25 7 30 35 7 17 32 45 27 38
49 19 53 40 22 4 36 20 49 25 61 48 67 34 57 52 46 45 33 41 20 38 34 58 63
输出样例:
12
292
参考代码:
#include<bits/stdc++.h>
using namespace std;
// 定义一个二维数组J,用于存储动态规划的结果
int J[401][1501];
// dp函数:计算最大价值
// n: 物品数量
// v: 背包容量
// jia[]: 每个物品的价值
// ti[]: 每个物品的重量
int dp(int n, int v, int jia[], int ti[])
{
// 初始化第一行的值
for (int j = 0; j <= v; j++)
{
J[0][j] = 0;
}
// 动态规划过程
for (int i = 1; i <= n; i++)
for (int j = 0; j <= v; j++)
{
// 如果当前物品重量大于背包容量,无法放入背包
if (j < ti[i])
{
J[i][j] = J[i - 1][j];
}
// 否则,可以选择放入或不放入背包,取最大值
else
{
J[i][j] = max(J[i - 1][j], J[i - 1][j - ti[i]] + jia[i]);
}
}
// 返回最大价值
return J[n][v];
}
int main()
{
int n, v;
int jia[401];
int ti[401];
// 读取输入数据
while (scanf("%d%d", &n, &v) != EOF)
{
for (int i = 1; i <= n; i++)
{
cin >> ti[i];
}
for (int i = 1; i <= n; i++)
{
cin >> jia[i];
}
// 调用dp函数计算最大价值并输出结果
cout << dp(n, v, jia, ti) << endl;
}
}