给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。 应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。 输入格式:共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。 输出格式:输出装入背包中物品的最大总价值。
时间: 2023-10-25 11:28:23 浏览: 95
可以使用动态规划算法来解决这个经典的背包问题。
定义一个二维数组dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。则有以下状态转移方程:
当j<w[i]时,dp[i][j]=dp[i-1][j],即背包容量不足,无法放入第i个物品;
当j>=w[i]时,dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]),即可选择放入第i个物品或不放入,取最大值。
最终背包能够获得的最大价值即为dp[n][C]。
代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110, M = 1010;
int n, C;
int w[N], v[N];
int dp[N][M];
int main()
{
cin >> n >> C;
for (int i = 1; i <= n; i ++ )
cin >> w[i] >> v[i];
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= C; j ++ )
{
dp[i][j] = dp[i-1][j];
if (j >= w[i]) dp[i][j] = max(dp[i][j], dp[i-1][j-w[i]]+v[i]);
}
cout << dp[n][C] << endl;
return 0;
}
```
阅读全文