标准多重背包:
方法1:转化为01背包
代码:
#include<stdio.h>
#include<string.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k,n,m;
int dp[110];
int p[110],h[110],c[110];
int T;
scanf("%d",&T);
while(T--)
{
memset(p,0,sizeof(p));
memset(h,0,sizeof(h));
memset(c,0,sizeof(c));
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
scanf("%d%d%d",&p[i],&h[i],&c[i]);
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
for(k=1;k<=c[i];k++)
{
for(j=m;j>=p[i];j--)
{
dp[j]=Max(dp[j-p[i]]+h[i],dp[j]);
}
}
}
printf("%d\n",dp[m]);
}
return 0;
}
方法2:二进制优化
代码:
#include<stdio.h>
#include<string.h>
int p[110],h[110],c[110],dp[110];
int n,m;
int Max(int a,int b)
{
return a>b?a:b;
}
void Completepack(int cost,int val,int maxm)
{
int i;
for(i=cost;i<=maxm;i++)
dp[i]=Max(dp[i-cost]+val,dp[i]);
}
void Zeronepackage(int cost,int val,int maxm)
{
int i;
for(i=maxm;i>=cost;i--)
dp[i]=Max(dp[i-cost]+val,dp[i]);
}
void Multipackage(int p[],int h[],int c[],int n,int m)
{
int i,k;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
if(c[i]*p[i]>m)
Completepack(p[i],h[i],m);
else
{
k=1;
while(k<c[i])
{
Zeronepackage(k*p[i],k*h[i],m);
c[i]-=k;
k=k*2;
}
Zeronepackage(c[i]*p[i],c[i]*h[i],m);
}
}
printf("%d\n",dp[m]);
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
memset(p,0,sizeof(p));
memset(h,0,sizeof(h));
memset(c,0,sizeof(c));
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
scanf("%d%d%d",&p[i],&h[i],&c[i]);
Multipackage(p,h,c,n,m);
}
return 0;
}
基本就是套用背包9讲内容的