多重背包
//二进制优化的多重背包
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=110,maxw=100010;
int N,W,cost[maxn],weight[maxn],number[maxn],dp[maxw];
void knapsack(int n,int w){
for(int i=1;i<=n;i++){
int num=min(number[i],w/weight[i]);
for(int k=1;num>0;k*=2){
if(k>num) k=num;
num-=k;
for(int j=w;j>=weight[i];j--)
dp[j]=max(dp[j],dp[j-k*weight[i]]+k*cost[i]);
}
}
}
int main(){
scanf("%d%d",&N,&W);
for(int i=1;i<=N;i++)
scanf("%d%d%d",&number[i],&weight[i],&cost[i]);
knapsack(N,W);
cout<<dp[W];
return 0;
}
输入
2 10 4 2 100 2 4 100
输出
400

浙公网安备 33010602011771号