L3-001 凑零钱(30 分)

╰+哭是因爲堅強的太久メ 2022-05-23 11:13 283阅读 0赞

韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有10^4^枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。

输入格式:

输入第一行给出两个正整数:N(<=10^4^)是硬币的总个数,M(<=10^2^)是韩梅梅要付的款额。第二行给出N枚硬币的正整数面值。数字间以空格分隔。

输出格式:

在一行中输出硬币的面值 V~1~ <= V~2~ <= … <= V~k~,满足条件V~1~ + V~2~ + … + V~k~ =M。数字间以1个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出“NoSolution”。

注:我们说序列{A[1], A[2], …}比{B[1], B[2], …}“小”,是指存在k >= 1 使得 A[i]=B[i] 对所有 i < k 成立,并且 A[k] <B[k]。

输入样例1:

  1. 8 9
  2. 5 9 8 7 2 3 4 1

输出样例1:

  1. 1 3 5

输入样例2:

  1. 4 8
  2. 7 2 4 3

输出样例2:

  1. No Solution

代码:

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. int values[10001],dp[101],choose[10001][101];
  6. bool cmp(int a,int b)
  7. {
  8. return a>b;
  9. }
  10. int main()
  11. {
  12. int i,j,n,m,k,t;
  13. scanf("%d %d",&n,&m);
  14. for(i=1;i<=n;i++)
  15. {
  16. scanf("%d",&values[i]);
  17. }
  18. sort(values+1,values+n+1,cmp);
  19. for(i=1;i<=n;i++)
  20. {
  21. for(j=m;j>=values[i];j--)
  22. {
  23. if(dp[j]<=dp[j-values[i]]+values[i])
  24. {
  25. choose[i][j]=1;
  26. dp[j]=dp[j-values[i]]+values[i];
  27. }
  28. }
  29. }
  30. if(dp[m]!=m)
  31. {
  32. printf("No Solution\n");
  33. return 0;
  34. }
  35. int index=n,sum=m;
  36. vector<int> arr;
  37. while(sum>0)
  38. {
  39. if(choose[index][sum]==1)
  40. {
  41. arr.push_back(values[index]);
  42. sum-=values[index];
  43. }
  44. index--;
  45. }
  46. for(i=0;i<arr.size();i++)
  47. {
  48. if(i==0)
  49. {
  50. printf("%d",arr[i]);
  51. }
  52. else
  53. {
  54. printf(" %d",arr[i]);
  55. }
  56. }
  57. printf("\n");
  58. return 0;
  59. }

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【PTA】零钱

    题目重述 韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 104枚来

    相关 零钱问题

    题目:给你k种面值的硬币,面值分别为 c1, c2 … ck,每种硬币的数量无限,再给一个总金额 amount,问你amount 最少需要几枚硬币凑出这个金额,如果不可能凑出,

    相关 L3-005 垃圾箱分布(30

    大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的

    相关 L3-003 社交集群(30

    在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。 输入格式: 输

    相关 L3-002 堆栈(30

    大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操

    相关 L3-001 零钱 深搜

    L3-001 凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩