| 比赛 | 
    防止颓废的小练习v0.3 | 
    评测结果 | 
    AAAAAAAAAA | 
    | 题目名称 | 
    宝物筛选 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    农场主 | 
    运行时间 | 
    0.511 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.46 MiB  | 
    | 提交时间 | 
    2016-10-19 10:57:40 | 
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define maxn 40001
using namespace std;
class poi{
public:
	int v,w;
};
vector<poi> vec;
int v,w,c;
int n,m;
int d[maxn]={0};
void make(int v,int w,int c){
	int t=1;
	while(c){
		if (c<t) t=c; 
		vec.push_back((poi){v*t,w*t});
		c=c-t;
		t<<=1;
	}
}
void read(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++){
		scanf("%d%d%d",&v,&w,&c);
		make(v,w,c);
	}
}
void DP(){
	int ans=0;
	for (int i=0;i<vec.size();i++){
		poi p=vec[i];
		for (int j=m;j>=0;j--){
			if (j+p.w<=m){
				d[j+p.w]=max(d[j+p.w],d[j]+p.v);
				
				ans=max(d[j+p.w],ans);
			}
//			printf("%d ",d[j+p.w]);
		}
//		printf("	%d %d\n",p.v,p.w);
	}
	printf("%d",ans);
}
int main(){
	freopen("treasure.in","r",stdin);
	freopen("treasure.out","w",stdout);
	read();
	DP();
	return 0;
}