题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出...
思路:变形的完全背包问题,只是求最小值
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int qq=500+50; 8 const int MAX=1e5; 9 int weight[qq],value[qq],dp[MAX]; 10 int main() 11 { 12 int t;scanf("%d",&t); 13 while(t--){ 14 int e,f;scanf("%d %d",&e,&f);//e是空罐的重量 f是满罐时的重量 15 int p=f-e; // p是硬币所占的重量、 16 int n;scanf("%d",&n); 17 for(int i=1;i<=n;++i) 18 scanf("%d %d",&value[i],&weight[i]); // 价值、重量 19 for(int i=1;i<=p;++i) 20 dp[i]=99999999; //初始化最大值、 一定要是原数据达不到的值 21 dp[0]=0; // 这里也一定要写出来、不然也会WA 22 for(int i=1;i<=n;++i) 23 for(int j=weight[i];j<=p;++j) 24 dp[j]=min(dp[j],dp[j-weight[i]]+value[i]); 25 if(dp[p]!=99999999) 26 printf("The minimum amount of money in the piggy-bank is %d. ",dp[p]); 27 else 28 printf("This is impossible. "); 29 } 30 return 0; 31 }
刚开始没注意dp数组的大小、 不断的TLM 最后发现直接给了自己一巴掌、 多么痛的领悟
后来又发现e,f范围很大、然而给出的MAX 又不够大、 又是一堆WA、
一直在强调自己的读题、然而还是出了这么的错误、
真是一个大写的懵比、