`
coolsooner
  • 浏览: 1310894 次
文章分类
社区版块
存档分类
最新评论

找零钱 解题报告

 
阅读更多

Code:
  1. 描述:
  2. PoorBessiehastakenajobintheconveniencestorelocatedjustovertheborderinSlobbovia.SlobboviansusedifferentcoinagesthantheUSA;theircoinvalueschangeday-by-day!
  3. HelpBessiemakeoptimalchangeforSlobbovianshoppers.YouwillneedtocreateC(1<=C<=1000)centsofchangeusingN(1<=N<=10)coinsofvariousvalues.Alltestcaseswillbesolvableusingthesuppliedcoins.
  4. If5coinsofvalues50,25,10,5,and1wereavailable,Bessiewouldmakeoptimumchange(minimalcoins)of93centsbyusing1x50,1x25,1x10,1x5,and3x1coins(atotalof7coins).
  5. Howhardcoulditbe?Thefinaltwotestcaseswillbechallenging.
  6. 输入:
  7. Line1:Twospace-separateintegers:CandN
  8. Lines2..N+1:Eachlinecontainsasingleuniqueintegerthatisacoinvaluethatcanbeusedtocreatechange
  9. 输出:
  10. Line1:AsingleintegerthatistheminimumnumberofcoinstocreateCcents
  11. 输入样例:
  12. 935
  13. 25
  14. 50
  15. 10
  16. 1
  17. 5
  18. 输出样例:7
  19. 解题思路:先想到用贪心法,可以从大的面额开始算,直到超出,然后换成小的面额去求,直到求出一个N,但后来总觉得有个地方可能会做不到,没那么容易贪的,如果面额没有1的时候,是不是可能出现不能刚好的情况,这个时候就得反过来让大的面额进行减少的处理,有点小麻烦。就想用另一种方法,动态规划,比如既然要求面额为93的最优解,就得求出92、91、90一直到1的最优解,把问题一直小化处理
  20. 例如:面值为50、25、1、10、5求93的最优解
  21. 要求93得先求43、68、92、83、88的最优解+1,就这样一直求下去
  22. 时间复杂度:O(m*n);
  23. 代码如下:
  24. #include<iostream>
  25. usingnamespacestd;
  26. intmain()
  27. {
  28. intn,m;
  29. inta[500]={0};
  30. intb[10000]={0};
  31. cout<<"请输入硬币面值的个数:";
  32. cin>>n;
  33. cout<<"请输入各个硬币的面值:";
  34. for(inti=1;i<=n;i++)
  35. cin>>a[i];
  36. cout<<"请输入要找的钱:";
  37. cin>>m;
  38. voidcoin(intn,intm,inta[],intb[]);
  39. coin(n,m,a,b);
  40. cout<<"最优解为:"<<b[m]<<endl;
  41. return0;
  42. }
  43. voidcoin(intn,intm,inta[],intb[])
  44. {
  45. b[0]=0;
  46. for(inti=1;i<=m;i++)
  47. {
  48. intmin=m;
  49. for(intj=1;j<=n;j++)
  50. {
  51. if(i>=a[j]&&b[i-a[j]]<min)
  52. min=b[i-a[j]];
  53. }
  54. b[i]=min+1;
  55. }
  56. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics