输入:t,n;n个数(n<=12):num[0]..num[n-1];
输出所有num[i]+num[j]..num[k]=t的式子,i!=j!=k。
不可重复,按降字典序输出。
简单dfs,太久没写dfs了,忘记递归回来后要mark[j]=0;样例还没检查出来。吃到WA。
AC代码:
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> using namespace std; int t,n,num[15],now[1010]; int mark[15]; int flag,pp; void print(int k) { int i;flag=0; printf("%d",now[0]); for (i=1;i<=k;++i) printf("+%d",now[i]); printf("\n"); } int dfs(int sum,int i,int k) { int j; now[i]=num[k]; if (sum>t) return 0; if (sum==t) { print(i);return 0;} for (j=k+1;j<n;++j) { if (!mark[j]&&num[j]!=pp) { mark[j]=1; dfs(sum+num[j],i+1,j); pp=num[j]; mark[j]=0; } } return 0; } int cmp(int a,int b) { return a>b; } int main () { int i,j,k; while (scanf("%d%d",&t,&n)&&n) { flag=1; for (i=0;i<n;++i) scanf("%d",&num[i]); sort(num,num+n,cmp); printf("Sums of %d:\n",t); for (i=0;i<n;++i) { if (i>0&&num[i]==num[i-1]) continue; memset(mark,0,sizeof(mark)); mark[i]=1;pp=-1; dfs(num[i],0,i); } if (flag) printf("NONE\n"); } return 0; }