多重背包

//二进制优化的多重背包 
#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
posted @ 2018-11-29 09:41  Interest_d  阅读(130)  评论(0)    收藏  举报