(蒟蒻提问)多重背包求助
  • 板块灌水区
  • 楼主zuer
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/5/14 15:05
  • 上次更新2023/11/4 23:17:37
查看原帖
(蒟蒻提问)多重背包求助
158094
zuer楼主2021/5/14 15:05
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int t,m;
int ob[15000][3];
int w[15000],v[15000];
int f[15000];
int main(){ 
    cin>>m>>t;
    for(int i=1;i<=m;i++) cin>>ob[i][0]>>ob[i][1]>>ob[i][2];//cost,value,number
    int top=0;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=ob[i][2];j++){
            w[++top]=ob[i][0];
            v[top]=ob[i][1];
        }
    } 
    for(int i=1;i<=m;i++){
        for(int j=t;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]);
    }
    cout<<f[t];

    return 0;
}
  • 【多重背包】转化为01 背包求解:把第i 种物品换成Mi 件01 背包中的物品,则得到了物品数为Σ\SigmaMi 的01 背包问题。直接求解之 输入 10 100

10 17 3

9 15 3

9 9 1

14 28 5

18 20 4

6 12 5

21 32 4

19 25 3

24 28 2

24 34 2

标准答案 200

但我输出 180

2021/5/14 15:05
加载中...