这一题的完全背包比较基础,是基础好题,涉及到几个问题:
一:如何处理背包恰好装满;
二:求最小的装满背包的价值;
解决办法是将f[ 0 ]置为0,其他置为INF,(要为求最大的装满背包的价值则置为-INF);注意v要从c[ i ]处开始;
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn= 10050;
const int Maxn= 10050;
const int INF=0x3f3f3f3f;
int f[maxn];
int c[Maxn],w[Maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int m,n,num;
scanf("%d%d",&n,&m);
m=m-n;
scanf("%d",&num);
for(int i=0;i<num;i++){
scanf("%d%d",&w[i],&c[i]);
}
memset(f,INF,sizeof(f)); //满足恰好装满的条件;
f[0]=0; //满足恰好装满的条件;
for(int i=0;i<num;i++){
for(int v=c[i];v<=m;v++){ //一定要从c[i]开始!;
f[v]=min(f[v],f[v-c[i]]+w[i]);
}
}
// for(int i=0;i<=m;i++)printf("%d :%d\n",i,f[i]);
if(f[m]!=INF)printf("The minimum amount of money in the piggy-bank is %d.\n",f[m]);
else printf("This is impossible.\n");
}
return 0;
}