要注意的就是 處理 相同的數字;
/* *HDU 1258 *fuqiang11 *DFS *2013/7/28*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>#define maxn 13using namespace std;int T,N;int a[maxn];int visit[maxn];int flag;int cmp(int x, int y){ return x > y;}void DFS(int sum, int pos){ if(sum == T) { flag = 1; int p = 0; for(int i = 1; i <= N; i++) { if(visit[i]==1) { if(p) cout<<"+"; cout<<a[i]; p = 1; } } cout<<endl; return ; } for(int i = pos; i <= N; i++) { if(visit[i]==0 && sum + a[i] <= T) { visit[i] = 1; DFS(sum+a[i],i+1); visit[i] = 0; } while(i<=N && a[i]==a[i+1]) i++; }}int main(){#ifndef ONLINE_JUDGE freopen("in","r",stdin);#endif while(cin>>T && T) { cin>>N; memset(visit, 0, sizeof(visit)); for (int i = 1; i <= N; i++) { cin>>a[i]; if(a[i] > T) visit[i] = -1; } cout<<"Sums of "<<T<<":"<<endl; flag = 0; sort(a+1,a+N+1,cmp); DFS(0,1); if(!flag) cout<<"NONE"<<endl; }}