题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=2191
01 背包和完全背包结合解题 现在我做这样的题 都用这个方法
http://blog.csdn.net/lyhvoyage/article/details/8545852#
推荐 POJ的 1276 可以练练手
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int p[110],h[110],c[110],dp[120000];
int n;
void comback(int v ,int w)
{
for(int i=v;i<=n;i++)
dp[i]=max(dp[i],dp[i-v]+w);
}
void oneback(int v,int w)
{
for(int i=n;i>=v;i--)
dp[i]=max(dp[i],dp[i-v]+w);
}
int main()
{
int T,i,j,m;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&p[i],&h[i],&c[i]);
for(i=1;i<=m;i++)
{
if(p[i]*c[i]>=n)
comback(p[i],h[i]);
else
{
for(j=1;j<c[i];j<<=1) //二进制移位
{
oneback(j*p[i],j*h[i]);
c[i]-=j;
}
oneback(p[i]*c[i],h[i]*c[i]);
}
}
printf("%d\n",dp[n]);
}
return 0;
}