当前位置:首页 > 题解目录 > 正文内容

【动态规划】完全背包

亿万年的星光1年前 (2024-12-06)题解目录958

【题目描述】

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为m,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于m,而价值的和为最大。

【输入】

第一行:两个整数,m(背包容量,m<=200)和n(物品数量n<=30);

第2....N+1行:每行二个整数Wi,Ci表示每个物品的重量和价值。

【输出】

仅一行,一个数,表示最大总价值。

【输入样例】

10 4
2 1
3 3
4 5
7 9


【输出样例】

max=12

【题目分析】

  1. 输入部分

    • 首先读取两个整数,m 为背包的最大容量,n 为物品的数量。

    • 接着,通过循环读取每个物品的信息,包括其重量 Wi 和价值 Ci

  2. 动态规划数组

    • 创建一个长度为 m + 1 的数组 dp,用于存储在各个可能的背包容量下获得的最大价值。

  3. 状态转移处理

    • 外层循环遍历所有的物品(从 0 到 n-1)。

    • 内层循环从当前物品的重量开始迭代到背包的最大容量 m。这是因为,对于无限数量的物品,可以多次选择同一物品,所以这里的内层循环的起始位置应该是 weights[i]

    • 在每一步更新 dp[j] 时,计算不选择和选择当前物品所能得到的最大价值,并选择较大值进行更新。

  4. 输出结果

    • 最后,打印出在背包最大容量 m 下的最大总价值。



【参考代码】

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int m, n;
    cin >> m >> n; // 读取背包容量 m 和物品数量 n

    int weights[30]; // 存放物品重量,大小为最大数量 n
    int values[30];  // 存放物品价值,大小为最大数量 n
    int dp[201] = {0}; // dp 数组初始化,大小为最大容量 m + 1,初始值为 0

    // 读取每个物品的重量和价值
    for (int i = 0; i < n; i++) {
        cin >> weights[i] >> values[i];
    }

    // 动态规划处理
    for (int i = 0; i < n; i++) {
        for (int j = weights[i]; j <= m; j++) { // 从 weights[i] 开始更新
            dp[j] = max(dp[j], dp[j - weights[i]] + values[i]);
        }
    }

    // 输出最大总价值
    cout << "max=" << dp[m] << endl;

    return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:
    返回列表

    上一篇:植树节

    下一篇:【题解】阳光

    相关文章

    【题解】王国比赛

    【题解】王国比赛

    【题目描述】智慧之王 Kri 统治着一座王国。 这天 Kri 决定举行一场比赛,来检验自己大臣的智慧。 比赛由 n道判断题组成,有 m位大臣参加。现在你已经知道了所有大臣的答题情况,但尚未拿到答...

    【题解】取数

    【题目描述】设有N 个正整数(1 <= N <= 50),其中每一个均是大于等于1、小于等于300的数。从这N个数中任取出若干个数(不能取相邻的数),要求得到一种取法,使得到的和为最大。例...

    【题解】循环比赛日程表

    【题目描述】设有N个选手进行循环比赛,其中 N=2^M ,要求每名选手要与其他的N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。【输入描述】输入M【输出描述】一...

    2021年崂山区程序设计竞赛题(初中组)

    2021年崂山区程序设计竞赛题(初中组)(比赛时间90分钟,试题满分300分)题目名称区间和区间位数的个数有序数组保存文件sumdigitarray输入文件名sum.indigit.inarray.i...

    【题解】搭配购买

    【题目描述】Joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有n朵云,云朵被编号为1,2,…,n,并且每朵云都有一个价值。但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配...

    2021年市北区程序设计竞赛试题(初中组)

    2021年市北区程序设计竞赛试题(初中组)

    1.开关灯(light.cpp)【题目描述】某实验室共有n盏灯,灯的编号为1~n,每盏灯的初始状态是关闭的。现在有m位学生,每位学生可以前去抽取一张带数字的卡片,其数字为Ai,然后依次将自己手中的数字...