http://acm.hdu.edu.cn/showproblem.php?pid=2191
裸多重背包
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <algorithm> using namespace std ; int dp[10001] ; int c[101],w[101],num[101] ; int V ; bool cmp(int a,int b) { return a>b ; } void ZeroOnePack(int c,int w) { for(int i=V;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+w) ; return ; } void CompletePack(int c,int w) { for(int i=c;i<=V;i++) dp[i]=max(dp[i],dp[i-c]+w) ; return ; } void MultiplePack(int c,int w,int a) { if(c*a>=V) { CompletePack(c,w) ; return ; } int k=1 ; while(k<a) { ZeroOnePack(k*c,k*w) ; a-=k ; k<<=1 ; } ZeroOnePack(a*c,a*w) ; } int main() { int t ; scanf("%d",&t) ; while(t--) { int n,m ; scanf("%d%d",&n,&m) ; for(int i=0;i<m;i++) scanf("%d%d%d",&c[i],&w[i],&num[i]) ; memset(dp,0,sizeof(dp)) ; V=n ; for(int i=0;i<n;i++) MultiplePack(c[i],w[i],num[i]) ; sort(dp,dp+10001,cmp) ; printf("%d\n",dp[0]) ; } return 0 ; }