【正经题解】多重背包-买奖品
2024-03-15 10:53:48
发布于:浙江
28阅读
0回复
0点赞
这段代码使用动态规划求解多重背包问题,其中 [ ] 表示拨款金额为 时的最大价值。通过三重循环遍历每种奖品、拨款金额和购买数量,更新最大价值。最终输出最大价值。
#include <iostream>
using namespace std;
// 定义商品价格、价值和最大数量的数组
int w[10005], c[10005], n[10005];
// 定义动态规划数组
int dp[10005];
int main() {
// 输入购买的奖品总数和拨款金额
int N, M;
cin >> N >> M;
// 输入每种奖品的价格、价值和最大数量
for (int i = 1; i <= N; i++) {
cin >> w[i] >> c[i] >> n[i];
}
// 遍历每种奖品
for (int i = 1; i <= N; i++) {
// 遍历拨款金额
for (int j = M; j >= 0; j--) {
// 遍历购买数量
for (int k = 1; k <= n[i]; k++) {
// 判断是否能够购买
if (j >= w[i] * k) {
// 更新最大价值
dp[j] = max(dp[j], dp[j - w[i] * k] + c[i] * k);
}
}
}
}
// 输出最大价值
cout << dp[M] << endl;
return 0;
}
全部评论 2
我的跟他大体相同:
#include<iostream> using namespace std; int dp[10001]; int w[1001],v[1001],c[1001]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>w[i]>>v[i]>>c[i]; } for(int i=1;i<=n;i++) { for(int j=m;j>=1;j--) { for(int k=c[i];k>=0;k--) { if(j>=k*w[i]) { dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]); } } } } cout<<dp[m]; return 0; }
2024-09-28 来自 广东
0赞赞赞
2024-09-28 来自 广东
0
有帮助,赞一个