题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
思路:完全背包模板
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,dp[200100],p,h,c; void zerof(int cost,int val) { for(int i=n;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+val); } void completf(int cost,int val) { for(int i=cost;i<=n;i++) dp[i]=max(dp[i],dp[i-cost]+val); } void Mul(int cost,int val,int num) { if(cost*num>=n) completf(cost,val); else { for(int i=1;i<=num;i*=2) { zerof(i*cost,i*val); num-=i; } zerof(num*cost,num*val); } } int main(void) { int i,j,k,t; cin>>t; while(t--) { cin>>n>>m; memset(dp,0,sizeof(dp)); for(i=0;i<m;i++) { cin>>p>>h>>c; Mul(p,h,c); } printf("%d ",dp[n]); } return 0; }