输入描述
第一行:二个整数,M(背包容量,M≤200),N(物品数量,N≤30); 第2..N+1行:每行三个整数 Wi,Ci,Pi ,前两个整数分别表示每个物品的重量,价值,第三个整数若为0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数( P i )。
输出描述
仅一行,一个数,表示最大总价值。
样例
输入
10 3 2 1 0 3 3 1 4 5 4
输出
11
提示
选第一件物品1件和第三件物品2件。
代码
#include<iostream>
using namespace std;
int m,n,a[24005],w[24005],w1,c1,c[24005],sl,cnt=0;
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>w1>>c1>>sl;
int x=1;
if(sl==0) sl=m/w1;
while(sl>=x){
c[++cnt]=c1*x;
w[cnt]=w1*x;
sl-=x;
x*=2;
}
if(sl>0){
c[++cnt]=sl*c1;
w[cnt]=w1*sl;
}
}
a[0]=0;
for(int i=1;i<=cnt;i++){
for(int j=m;j>=w[i];j--){
a[j]=max(a[j-w[i]]+c[i],a[j]);
}
}
cout<<a[m];
return 0;
}
361

被折叠的 条评论
为什么被折叠?



