问题描述:
有N枚硬币,给出每枚硬币的价值,现在要用这些硬币去支付价值为M的东西。
问是否可以找见这样的方案,使得选择用来支付的硬币价值之和恰好为M,如果不存在,输出NoSolution。
如果存在,从小到大输出选择用来支付硬币的价值,如果有多种方案,则输出字典序最小的那个。(A1 = B1, A2 = B2 , ...... Ai = Bi 但 A(i+1) < B(i+1)
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 10010;
int a[maxn];
int n, m;
multiset<int> s;
void find_sequence(int left, int right, int val)
{
while(left < right && a[left]+a[right]!=val)
{
if(a[left]+a[right] < val && left < right)
left++;
else if(a[left]+a[right] > val && right > left)
right--;
}
if(a[left]+a[right] == val)
{
s.erase(val);
s.insert(a[left]);
s.insert(a[right]);
find_sequence(left+1, right-1, a[right]);
}
if(left >= right)
return;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a+n);
find_sequence(0,n-1,m);
if(s.size() < 2)
{
printf("No Solution\n");
return 0;
}
auto x = --s.end();
for(auto i = s.begin(); i != s.end();i++)
{
printf("%d", *i);
if(i != x)
printf(" ");
}
return 0;
}