解题思路:多重背包的模板题,就是在01背包的基础上多加了一个循环取奖品的个数

参考代码:

//
// Created by 15420 on 2021/5/20.
//

#include <iostream>
using namespace std;
int n,m,v[510],w[510],s[510],dp[6600];
int main()
{
    cin>>n>>m;//n代表希望购买的奖品的种数,m表示拨款金额。
    for (int i = 1; i <=n ; ++i) {
        cin>>v[i]>>w[i]>>s[i];//分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和能购买的最大数量(买0件到s件均可)
    }
    for (int i = 1; i <=n ; ++i) {//其实就是01背包多加了一个循环取奖品的个数
        for (int j = m; j >=1 ; --j) {
            for (int k = 0; k <=s[i]&&j>=k*v[i] ; ++k) {//购买奖品的个数不能超过s[i]个,取k个i物品价值不能超过总价值
                dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);//这里是取和不取k个奖品那个更好
            }
        }
    }
    cout<<dp[m];//最后输出奖品的最大总价值
    return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论