L3-001. 凑零钱
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。
输入格式:
输入第一行给出两个正整数:N(<=104)是硬币的总个数,M(<=102)是韩梅梅要付的款额。第二行给出N枚硬币的正整数面值。数字间以空格分隔。
输出格式:
在一行中输出硬币的面值 V1 <= V2 <= ... <= Vk,满足条件 V1 + V2 + ... + Vk = M。数字间以1个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出“No Solution”。
注:我们说序列{A[1], A[2], ...}比{B[1], B[2], ...}“小”,是指存在 k >= 1 使得 A[i]=B[i] 对所有 i < k 成立,并且 A[k] < B[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<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N],vis[N],solve[N],n,aim;
stack<int> st;
int flag =0;
int sum = 0;
void fun(int i,int sum,int cnt){
if(sum==aim){
for(int j=0;j<cnt-1;j++){
cout<<solve[j]<<" ";
}
cout<<solve[cnt-1]<<endl;
flag = 1;
}
if(sum>aim||flag) return ;
for(int j = i+1;j < n;j++){
solve[cnt] = a[j];
fun(j,sum+a[j],cnt+1);
if(flag) return;
}
}
int main(){
cin>>n>>aim;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum<aim){
cout<<"No Solution"<<endl;
}
else{
sort(a,a+n);
fun(-1,0,0);
if(!flag) cout<<"No Solution"<<endl;
}
}