例:t=4. a[]={4,3,2,2,1,1}
輸出 4,3+1,2+2,2+1+1
解題思路:題目要求輸出從大到小輸出,所以可以先給所有的數進行降序排序。數據的規模很小,所以可以用暴力搜索。搜索過程中,爲了避免重複輸出,需要記錄前一層搜索的起點,下一層遞歸搜索的起點不能與前一層記錄的點一樣
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int t,n;
int a[20];
int save[20];
int index;
int used[20];
int sign;
int cmp(const int &a, const int& b)
{
return a > b;
}
void dfs(int k, int sum)
{
if(sum > t)
{
return ;
}
if(sum == t)
{
sign = 1;
for(int i=0; i<index-1; i++)
{
cout<<save[i]<<"+";
}
cout<<save[index-1]<<endl;
return ;
}
int last = -1;
for(int i=k+1; i<=n; i++)
{
if(a[i] != last) //當前的數不能跟上一次搜索的起點的數值一樣,不然會造成重複
{
save[index++] = a[i];
last = a[i]; //last保存當前搜索的起點
dfs(i,sum+a[i]);
index--;
}
}
}
int main()
{
int i;
while(cin>>t>>n,t+n)
{
index = 0;
sign = 0;
for(i=1; i<=n; i++)
{
cin>>a[i];
}
sort(a+1,a+n+1,cmp); //降序排序
printf("Sums of %d:/n",t);
dfs(0,0);
if(!sign)
{
cout<<"NONE"<<endl;
}
}
return 0;
}