题意:中文题,省。
ac代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int a[15]; int use[15]; int foat;//判断是否要输出“NONE” int t,n; int k;//use[]数组中使用 bool cmp(int a,int b) { return a>b; } void dfs(int s,int step,int k) { if(t==s) { foat=1; for(int i=0;i<k-1;i++) cout<<a[use[i]]<<"+"; cout<<a[use[k-1]]<<endl; return ; } for(int i=step;i<=n;i++) { if(a[i]!=a[i-1]||i==step)//保证只输出一个“3+1”,确保唯一性. { if(s+a[i]<=t) { use[k]=i; dfs(s+a[i],i+1,k+1); } } } return ; } int main() { while(cin>>t>>n) { if(t==0&&n==0)break; memset(a,0,sizeof(a)); memset(use,0,sizeof(use)); for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1,cmp);//从大到小排序 printf("Sums of %d:\n",t); foat=0; k=0; dfs(0,1,0); if(foat==0) cout<<"NONE"<<endl; } return 0; } /* 4 6 1 2 2 4 3 1 5 5 4 3 2 1 1 5 3 2 1 1 400 12 50 50 50 50 50 50 25 25 25 25 25 25 */