多重背包解法:
#include<stdio.h>
#include<string.h>
#define Nmax 11
int v[Nmax];
int w[Nmax];
int dp[21];
int m;
void zobag(int v,int w){
for(int i=m;i>=w;i--)
if(dp[i]<dp[i-w]+v)
dp[i]=dp[i-w]+v;
}
void combag(int v,int w){
for(int i=w;i<=m;i++)
if(dp[i]<dp[i-w]+v)
dp[i]=dp[i-w]+v;
}
void multibag(int v,int w,int c){
if(c*w>m)
combag(v,w);
else{
int k=1;
while(k<c){
zobag(v*k,w*k);
c-=k;
k*=2;
}
zobag(v*c,w*c);
}
}
int main(){
int N,s,i,j;
scanf("%d",&N);
while(N--){
memset(dp,0,sizeof(dp));
scanf("%d%d",&s,&m);
for(i=0;i<s;i++)
scanf("%d%d",&v[i],&w[i]);
for(i=0;i<s;i++)
multibag(v[i],1,w[i]);
printf("%d\n",dp[m]);
}
return 0;
}
贪心的解法:
#include<stdio.h>
#include<stdlib.h>
struct In{
int v;
int w;
}dd[10];
int cmp(const void*a,const void*b)
{
struct In*c=(In*)a;
struct In*d=(In*)b;
return d->v-c->v;
}
int main()
{
int T,s,m,i;
scanf("%d",&T);
while(T--)
{
int pout=0;
scanf("%d%d",&s,&m);
for(i=0;i<s;i++)
scanf("%d%d",&dd[i].v,&dd[i].w);
qsort(dd,s,sizeof(dd[0]),cmp);
i=0;
while(1)
{
if(m<=dd[i].w){
pout+=m*dd[i].v;
break;
}
else{
pout+=dd[i].w*dd[i].v;
m-=dd[i].w;
i++;
}
}
printf("%d\n",pout);
}
return 0;
}