HDU 1114 簡單dp 揹包
阿新 • • 發佈:2019-01-07
要求:給出空存錢罐和存錢後存錢罐的重量,給出可能的若干種硬幣的面值和重量,求存錢罐裝的最小面值,若給定的硬幣無法組成存錢罐的增重,則按要求輸出。
方法:揹包變形題。
1.完全揹包變形題。
2.dp[i]表示存錢的重量為i時的最小錢數。
3.狀態轉移方程:dp[i]=min(dp[i],dp[i-w[j]]+p[j]),j表示硬幣種類的下標。
4.注意狀態轉移時dp[i-w[j]]必須有錢數。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int main() { int t,i,j,k,e,f,n,min1,flag; int c,p[505],w[505]; int dp[10005];//dp[i]表示重量為i時的最小金額 scanf("%d",&t); while(t--) { scanf("%d%d",&e,&f); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&p[i],&w[i]); } c=f-e; memset(dp,inf,sizeof(dp)); for(i=0;i<=c;i++) { flag=0; for(j=0;j<n;j++) { if(w[j]<=i&&(dp[i-w[j]]!=0||i==w[j])) { dp[i]=min(dp[i],dp[i-w[j]]+p[j]); flag=1; } } if(flag==0) dp[i]=0; } if(dp[c]==0) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[c]); } }