韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 10000 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。
输入格式:
输入第一行给出两个正整数:N(≤)是硬币的总个数,M(≤)是韩梅梅要付的款额。第二行给出 N 枚硬币的正整数面值。数字间以空格分隔。
输出格式:
在一行中输出硬币的面值 V1≤V2≤⋯≤Vk,满足条件 .。数字间以 1 个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出 No Solution
。
注:我们说序列{ [ }比{ [ }“小”,是指存在 k≥1 使得 [ 对所有 i<k 成立,并且 [。
输入样例 1:
8 9 5 9 8 7 2 3 4 1
输出样例 1:
1 3 5
输入样例 2:
4 8 7 2 4 3
输出样例 2:
No Solution
代码示例:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int s[10000]; int n,m; vector<int>p; bool flag=false; void dfs(int v,int sum){ if(sum>m||v>n){ return; } if(sum==m){ for(int i=0;i<p.size();i++){ if(i){ printf(" "); } printf("%d",p[i]); } printf("\n"); flag=true; return; } if(flag){ return; } p.push_back(s[v]); dfs(v+1,sum+s[v]); p.pop_back(); dfs(v+1,sum); } int main(){ scanf("%d %d",&n,&m); int sum=0; for(int i=0;i<n;i++){ scanf("%d",&s[i]); sum+=s[i]; } sort(s,s+n); if(sum<m){ printf("No Solution\n"); } else{ dfs(0,0); if(!flag) { printf("No Solution\n"); } } }
。
来源:https://www.cnblogs.com/bjxqmy/p/12019570.html