【题解】
题目要求输出字典序最小,所以我们先把给定序列升序排序,然后得到的第一个结果显然就是字典序最小的可能结果。
最后一个测试样例超时的点在于,可能全部加起来都不足以凑到m,所以我们要先判断一下。
【代码】
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt=0,f=0;
int a[10005];
int ans[10005];
void dfs(int pos,int sum)
{
if(sum>m) return;
if(sum==m){
f=1;
for(int i=0;i<cnt;i++)
printf(i==cnt-1?"%d":"%d ",ans[i]);
return;
}
for(int i=pos;i<n;i++){
ans[cnt++]=a[i];
dfs(i+1,sum+a[i]);
if(f) break;
cnt--;
}
}
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) puts("No Solution");
else{
sort(a,a+n);
dfs(0,0

该博客介绍了如何解决火星商店凑零钱的问题,利用深度优先搜索(DFS)策略,首先将硬币升序排列,然后判断是否能凑出指定金额。如果可以,输出字典序最小的硬币组合;若无法凑出,输出无解。博客还提供了输入输出样例和代码实现。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=88822171&d=1&t=3&u=a3b4154c7f3c41b680eb1d33fb1fe17c)

被折叠的 条评论
为什么被折叠?



