一句话,完全背包问题。
状态转移方程:
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; }