韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 1 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。
输入格式:
输入第一行给出两个正整数: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
普通dfs差一个点TL 加一个后缀数组就过了
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 10020 int n,m; int a[N]; LL sumnum[N]; int flag=1; int path[N]; void dfs(int cur,int sum,int num) { if(sum>m)return ; if(flag==0)return; if(sum==m) { flag=0; rep(i,1,num-1) { if(i!=1)printf(" "); printf("%d",path[i]); } } rep(i,cur+1,n) { if(sum+a[i]>m)continue; if(sum+sumnum[i]<m)continue; path[num]=a[i]; dfs(i,sum+a[i],num+1); } } int main() { RII(n,m); rep(i,1,n) RI(a[i]); sort(a+1,a+1+n); sumnum[n]=a[n]; repp(i,n-1,1) sumnum[i]=sumnum[i+1]+a[i]; dfs(0,0,1); if(flag) printf("No Solution"); return 0; }