给定n(n=20)种物品和一背包。物品i的重量是wi(其中有一个重量为自己学号,其余都是5~10间的随机整数,),其价值为vi(10~20间的随机整数),背包的容量为C(C=60),应如何选择装入背包的物品,使得装入背包中物品的总价值最大?使用动态规划求解该问题。
时间: 2023-10-03 14:05:05 浏览: 54
这是一个典型的背包问题,可以使用动态规划算法求解。具体做法为:定义一个二维数组dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。则状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi]+vi)
其中,第一项表示不选第i个物品,第二项表示选第i个物品。最终的答案即为dp[n][C]。
具体的实现过程可以参考以下代码:
int n = 20;
int C = 60;
int w[n+1], v[n+1];
for(int i=1;i<=n;i++){
if(i==自己的学号){
w[i] = i;
}else{
w[i] = rand()%6 + 5;
}
v[i] = rand()%11 + 10;
}
int dp[n+1][C+1];
memset(dp, 0, sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=C;j++){
if(j<w[i]){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]);
}
}
}
int ans = dp[n][C];
cout << "最大价值为:" << ans << endl;
阅读全文