题目地址: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;
}