一句话,完全背包问题。
状态转移方程:
if(dp[j-w[i]]+p[i]<dp[j])
dp[j]=dp[j-w[i]]+p[i];
#include<stdio.h>
#define MAX_NUM 10000000
#define NUM 10005
int dp[NUM],p[NUM],w[NUM];
int main()
{
int cases,e,f,n;
int i,j,v;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
scanf("%d",&cases);
while(cases--){
scanf("%d%d%d",&e,&f,&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i],&w[i]);
}
v=f-e;//总空间
for(i=1;i<=v;i++)
dp[i]=MAX_NUM;
for(i=0;i<n;i++)
for(j=w[i];j<=v;j++){
if(dp[j-w[i]]+p[i]<dp[j])
dp[j]=dp[j-w[i]]+p[i];
}
if(dp[v]==MAX_NUM)
printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);
}
return 0;
}