题目描述
有较大范围的多重背包问题
算法1
根据y总代码改的偏c语言的做法
C++ 代码
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
struct Good{
int v,w;
};
const int N =1010;
int dp[N];
int v[N],w[N],s[N];
int main()
{
int n,m;
int t=1;
Good goods[10005];
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
for(int i=1;i<=n;i++){
for(int k=1;k<=s[i];k*=2){
s[i]-=k;
goods[t].v=k*v[i];
goods[t++].w=k*w[i];
}
if(s[i]>0){
goods[t].v=s[i]*v[i];
goods[t++].w=s[i]*w[i];
}
}
for(int i=1;i<=t;i++){
for(int j=m;j>=goods[i].v;j--){
dp[j]=max(dp[j],dp[j-goods[i].v]+goods[i].w);
}
}
cout<<dp[m]<<endl;
return 0;
}