要注意的就是 处理 相同的数字;
/* *HDU 1258 *fuqiang11 *DFS *2013/7/28 */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #define maxn 13 using 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; } }