栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态规划01背包问题求解(附c/cpp代码)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划01背包问题求解(附c/cpp代码)

动态规划之01背包问题
    • 1. 问题描述
    • 2. 输入格式
    • 3. 输出格式
    • 4. 输入样例
    • 5. 输出样例
    • 6. 问题分析
    • 7. 代码实现
    • 8. 执行结果


1. 问题描述

有 n 种物品和一个容量是 y 的背包,每种物品只有一件。

第 i 种物品的体积是 wi,价值是 vi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值和物品序号。


2. 输入格式

第一行两个整数,N,Y,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数wi,vi,用逗号隔开,分别表示第 i 种物品的体积和价值。


3. 输出格式

输出最大价值,物品序列号。


4. 输入样例
3,10
5,8
8,20
4,17

5. 输出样例
最大价值:25
物品序号:3号 1号 

6. 问题分析




7. 代码实现
#include 
#include 
using namespace std;

typedef struct {
    int w;
    int v;
}Object;

int main(){
    int n,y;
    char ch;
    cin>>n>>ch>>y;
    Object ob[n+1];
    for(int i=1;i<=n;++i)
        cin>>ob[i].w>>ch>>ob[i].v;//ob[0]未使用
    int arr[n+1][y+1];
    for(int i=0;i
            arr[i][j] = arr[i-1][j];
            if(ob[i].w <= j)
                arr[i][j] = max(arr[i-1][j],arr[i-1][j-ob[i].w]+ob[i].v);
        }
    vector  r;
    int j = y;
    for(int i=n;i>0;--i)
        if (arr[i][j] != arr[i-1][j]){
            r.push_back(i);
            j = j - ob[i].w;
        }
    cout<<"最大价值:"<::iterator it = r.begin();it!=r.end();++it)
        cout<<*it<<"号 ";
    return 0;
}

8. 执行结果
10,30
2,3
5,6
8,6
10,12
6,7
9,11
4,7
6,8
7,8
5,8
最大价值:41
物品序号:10号 7号 6号 4号 1号
Process returned 0 (0x0)   execution time : 1.365 s
Press any key to continue.

——————END-2022-04-23——————
———————感谢您的阅读—————————

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号