連結:http://acm.hdu.edu.cn/showproblem.php?pid=1114 ================================== 題目大意,給你空小豬儲錢罐的重量和裝滿小豬儲錢罐的重量還有給你硬幣的價值和重量,讓你估計儲錢罐裡最少會有多少價值的錢這道題因為硬幣個數不為1,所謂我們考慮使用完全背包 這時候我們就要分析動態方程,要求的最小的價值,那麼很好理解,使用min函數,使dp儲存的是價值最小值。此時我們需要將dp數組初始化為
最大值,並且
dp[0]=0,表示什麼都不能放進去。然後我們考慮如何更新dp數組。dp保留的是最小值,那麼數組下標則要表示的是重量問題。所以可以這樣列動態方程:dp[i]=min(dp[i],dp[i-weight]+value); 接下來就很簡單了: AC代碼如下:
#include<iostream>#include<stdio.h>using namespace std;#define INF 100000000int dp[50010];int value[50010],weight[50010];int V,num;int E,F;int min(int a,int b){if(a>b)return b;elsereturn a;}void CompletePack(int value,int weight){int i;for(i=weight;i<=V;i++)dp[i]=min(dp[i],dp[i-weight]+value);}int main(){int Case;scanf("%d",&Case);while(Case--){int i;scanf("%d %d",&E,&F);scanf("%d",&num);V=F-E;for(i=1;i<=num;i++)scanf("%d %d",&value[i],&weight[i]);for(i=1;i<=V;i++)dp[i]=INF;dp[0]=0;for(i=1;i<=num;i++)CompletePack(value[i],weight[i]);if(dp[V]>=INF)printf("This is impossible.\n");elseprintf("The minimum amount of money in the piggy-bank is %d.\n",dp[V]);}return 0;}