7-1 凑零钱 (30分)
输入样例 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
样例解答:
动态规划,先对硬币价值升序排序,从左向右依次选取硬币,对于每个硬币都有两种情况,取或不取,当所取硬币总额等于所需总额时,输出(因为已经升序排序,所得的第一组数据就是最小序列),以此进行递归。
测试点6运行超时:
当所有硬币总额小于所需硬币总额时,直接输出"No Solution"即可。
#include<bits/stdc++.h>
using namespace std;
const int MAX = 10005;
int a[MAX];
int n,m;
int flag=0;
int a1[MAX],a1_num=0;
void dfs(int x,int sum){
if(sum==m){
flag=1;
for(int i=0;i<a1_num;i++){
if(i==0) printf("%d",a1[i]);
else printf(" %d",a1[i]);
}
return;
}
if(x>n) return;
if(flag==0&&sum+a[x]<=m){
a1[a1_num]=a[x];
a1_num++;
dfs(x+1,sum+a[x]);
a1_num--;
dfs(x+1,sum);
}
}
int main(){
scanf("%d %d",&n,&m);
int sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum<m){
cout<<"No Solution"<<endl;
return 0;
}
sort(a,a+n);
dfs(0,0);
if(flag==0) cout<<"No Solution"<<endl;
}