USACO备考冲刺必刷题 | P2639 Bessie‘s Weight Problem

学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。

附上汇总贴:USACO备考冲刺必刷题 | 汇总-CSDN博客


【题目描述】

Bessie 像她的诸多姊妹一样,因为从 Farmer John 的草地吃了太多美味的草而长出了太多的赘肉。所以 FJ 将她置于一个及其严格的节食计划之中。她每天不能吃多过 H(5≤H≤45,000) 公斤的干草。 Bessie 只能吃一整捆干草;当她开始吃一捆干草的之后就再也停不下来了。她有一个完整的N(1≤N≤500) 捆可以给她当作晚餐的干草的清单。她自然想要尽量吃到更多的干草。很自然地,每捆干草只能被吃一次(即使在列表中相同的重量可能出现2次,但是这表示的是两捆干草,其中每捆干草最多只能被吃掉一次)。 给定一个列表表示每捆干草的重量 Si(1≤SiH) , 求 Bessie 不超过节食的限制的前提下可以吃掉多少干草(注意一旦她开始吃一捆干草就会把那一捆干草全部吃完)。

【输入】

第一行有两个由空格隔开的整数 H 和 N

第 2 到第 N+1 行,第 i+1 行是一个单独的整数,表示第 i 捆干草的重量 Si

【输出】

第一行一个单独的整数表示 Bessie 在限制范围内最多可以吃多少公斤的干草。

【输入样例】

56 4
15
19
20
21

【输出样例】

56

【代码详解】

USACO备考冲刺必刷题 | P2639 Bessie‘s Weight Problem_第1张图片

#include 
using namespace std;
int h, n, wi[505],ci[505];
// int dp[205][45005] = {0};
int dp[45005] = {0};
int main()
{
    cin >> h >> n;  // 输入h和n,类似01背包中的N和M(h=M,n=N)
    for (int i=1; i<=n; i++) {  // 记录n件物品的Wi和Ci
        cin >> wi[i];
        ci[i] = wi[i];  // 题目描述中没有ci,但最后求最大重量,可以理解为最大价值,就让ci=wi
    }
    for (int i=1; i<=n; i++) {  // 遍历n个物品
        for (int j=h; j>=1; j--) {  // 遍历背包容量,即吃干草重量(此处是滚动数组模板)
            if (j>=wi[i]) {  // 如果装的下
                dp[j] = max(dp[j], dp[j-wi[i]] + ci[i]);  // dp[j-wi[i]]表示没有装入当前物品的价值,+ci[i]表示增加当前物品后的价值
            }
        }
    }
    cout << dp[h] << endl;  // 输出背包容量为h时是的结果
    return 0;
}

【运行结果】

56 4
15
19
20
21
56

你可能感兴趣的:(算法,动态规划)