01背包问题【动态规划求解】

本文介绍了一个经典的动态规划问题——0-1背包问题,并提供了详细的算法实现过程。通过递归寻找最优解,文章展示了如何在给定的物品集合中选择,以达到在不超过背包容量的情况下获得最大价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 f: 0-1 背包问题(动态规划)

时间限制: 1 Sec  内存限制: 128 MB
提交: 48  解决: 17

题目描述

给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?

在选择装入背包的物品时,对每种物品i只能有两种选择,装入或者不装入,不能装入多次,也不能部分装入。

输入

第一行输入物品的个数n。

第二行输入物品的重量序列w。(中间有空格)

第三行输入物品的价值序列v。(中间有空格)

第四行输入背包容量c。

 

输出

第一行输出装入背包的物品。(用0和1表示,中间无空格)

第二行输出最大价值。

样例输入

3
3 4 5
4 5 6
10

样例输出

011
11
#include <iostream>
#include <algorithm>
using namespace std;
int n, c;
int w[101], v[101];
int choose[101];
int value[101][101];
void max() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= c; j++) {
            if (j < w[i])value[i][j] = value[i - 1][j];
            else value[i][j] = max(value[i - 1][j], value[i - 1][j - w[i]] + v[i]);
        }
    }
}
void find(int x, int y) {
    if (x >= 0) {
        if (value[x - 1][y] == value[x][y]) { 
            choose[x] = 0; 
            find(x-1,y);
        }
        else if ((y - w[x]) >= 0 && value[x][y] == (value[x - 1][y - w[x]] + v[x])) {
            choose[x] = 1;
            find(x - 1, y - w[x]);

        }

    }

}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)cin >> w[i];
    for (int i = 1; i <= n; i++)cin >> v[i];
    cin >> c;
    max();
    find(n, c);
    for (int i = 1; i <= n; i++)cout << choose[i];
    cout << endl << value[n][c];
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值