多重背包(小明的背包)

该博客介绍了如何使用动态规划算法解决背包问题。小明面对一个背包容量限制,需要从多种不同体积和价值的物品中选择,目标是最大化背包内物品的总价值。文章通过两种方法实现:二维数组和一维数组的动态规划解决方案,并给出了输入数据和代码实现。
摘要由CSDN通过智能技术生成

小明有一个容量为 V 的背包。

这天他去商场购物,商场一共有 N种物品,第 i 种物品的体积为 wi,价值为 vi​,每种物品都有无限多个。

小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。

输入第 1行包含两个正整数 N,V,表示商场物品的数量和小明的背包容量。

输入样列:

5 20

1 6

2 5

3 8

5 15

3 3

/*小明有一个容量为V的背包。

这天他去商场购物,商场一共有 N 种物品,第 i 种物品的体积为 w
 ,价值为
 ,每种物品都有无限多个。

小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。*/
#include <iostream>
using namespace std;
const int maxn = 1000+10;
int n,m;//n 物品数量 m背包总量
int weight[maxn];//每一种物品的重量
int value[maxn];//每一种物品的价值
int dp[maxn][maxn];
int d[maxn];
/**
 * 输入数据
 */
void  input(){
    cin >> n>>m;
    for (int i = 1; i <= n ; ++i) {
        cin >> weight[i]>>value[i];
    }
}

/**
 * 使用二维数组存放状态转移数组
 * @return 最大的价值
 */
int dp1(){
    int maxx = 0;
    for (int i = 1; i <=n ; ++i) {
        for (int j = 0; j <=m; ++j) {
            if(j < weight[i]){
                dp[i][j]=dp[i-1][j];
            } else{
                dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
            }
            maxx = max(maxx,dp[i][j]);
        }

    }
    return maxx;
}

/**
 * 使用一维数组存放
 * @return 最大的价值
 */
int dp2(){
    int maxx = 0;
    for (int i = 1; i <=m ; ++i) {
        for (int j = weight[i]; j <=m;j++) {
            d[j]= max(d[j],d[j-weight[i]]+value[i]);
            maxx = max(maxx,d[j]);
        }
    }
    return maxx;
}
int main() {
    input();
    cout<<dp1()<<"\n";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值