多重背包问题

多重背包问题

题目

有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 M[i] 件可用,每件耗费的
空间是 C[i],价值是 W[i]。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超
过背包容量,且价值总和最大。

思路

比如第i件物品有s个,我可以把相同种类的物品的进行合并,比如我拿出两件合并出一个新的物品,我拿出三件合并出一个新的物品,以此类推,我拿出s个合并出一个新的物品。基于这种思想,我们把第i件的s个物品转换为s种体积各不相同的物品,然后在用01背包的思想,求出最优解,动态转移方程为:

F[i,v] = max{F[i − 1, v − k ∗ C[i]] + k ∗ W[i] | 0 ≤ k ≤ M[i]}
将多重背包转换成0-1背包问题:

第i物体有 s[i]个,这里将其看作体积和价值都相同但不同的物体。即在输入 v [ i ] , w [ i ]时重复输入第i个物体 s[i]次。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[1005];
int main()
{
    cin>>n>>m;
    while(n--)
    {
        int v,w,s;
        cin>>v>>w>>s;
        //每一次输入都可以看作有s个物体的0-1背包问题
        while(s--) //每多一次循环相当于多考虑一种物品的情况。
        {
            for(int j=m;j>=v;j--)
                dp[j]=max(dp[j],dp[j-v]+w);
        }
    }
    cout<<dp[m];
    return 0;
}

谢谢观看

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值