题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2191
把我所知道的优化全部放上去了 0MS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=10000+5;
int d[maxn];
int main()
{int T; cin>>T;while(T--){int P,N,p,w,n,k; cin>>P>>N;memset(d,0,sizeof(d));for(int i=1;i<=N;i++){scanf("%d%d%d",&p,&w,&n);if(p>P) continue;if(n*p>=P){ //完全背包 for(int i=p;i<=P;i++)d[i]=max(d[i],d[i-p]+w);continue;}k=1;while(n>k){for(int i=P;i>=k*p;i--)d[i]=max(d[i],d[i-k*p]+k*w);n-=k; k<<=1;}for(int i=P;i>=n*p;i--)d[i]=max(d[i],d[i-n*p]+n*w);}cout<<d[P]<<endl;}return 0;
}