本文主要是介绍L3-001 凑零钱 深搜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
L3-001 凑零钱 (30 分)
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 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
要判所有硬币加起来总金额少于m,就没有必要搜了,这个是最后一个点,不写的话只有29分~
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
int n,m,a[10005],pre[10005],f;
int out[10005],l=0;
void dfs(int t,int sum)
{//printf("t=%d sum=%d\n",t,sum);if(t==n||f)return;if(sum==m){f=1;while(t!=-1){out[l++]=a[t];t=pre[t];}return;}for(int i=t+1;i<n;i++){if(sum+a[i]<=m){pre[i]=t;dfs(i,sum+a[i]);}//else break;}
}
int main()
{int i,j,s=0;f=0;memset(pre,-1,sizeof pre);scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%d",&a[i]);s+=a[i];}if(s<m)printf("No Solution\n");else{sort(a,a+n);dfs(-1,0);if(f==0)printf("No Solution\n");else{for(i=l-1;i>=0;i--)printf("%d%c",out[i],i==0?'\n':' ');}}
}
这篇关于L3-001 凑零钱 深搜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!