这一道题 ,我本以为按常规方法做,以为只要比较前一组输出就行,可后来调试发现,输出竟然与上上一组重复,所以我重新写了好思路形成的代码。
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cstdlib> #define TEST using namespace std; int sum1[13],sum2[13],sum3[13],sum4[13]; int n,t,d,flag; void print_num(); void backtracking(int m); bool cmp(int a,int b) { return a > b; } void print_num(int m) { int index = 1,f; flag = 0; for(int i = 0; i <= d; i++) { if(sum4[i] != 0) { f =sum4[i]; while(f--){ if(index) {printf("%d",sum2[i]); index = 0;} else printf("+%d",sum2[i]); } } }sum4[m] = 0; printf("\n"); } void backtracking(int m) { int f; if(t <= 0) { if(t == 0) print_num(m); return ; } else if(m <=d) { f = sum3[m]; f++; do { f --; sum4[m] = f; t -=sum2[m]*f; backtracking(m+1); t +=sum2[m]*f; sum4[m] = 0; }while(f); } return ; } int main() { #ifdef TEST freopen("in.txt","r",stdin); freopen("out.text","w",stdout); #endif // TEST int i; while(~scanf("%d",&t)) { d = 0; scanf("%d",&n); if(n == 0) break; for(i= 0;i < n;i ++) scanf("%d",&sum1[i]); sort(sum1,sum1+n,cmp); memset(sum2,0,sizeof(sum2)); memset(sum3,0,sizeof(sum3));// 注意不能memset 1; memset(sum4,0,sizeof(sum4)); sum2[0] = sum1[0]; sum3[0] ++; for(i = 1; i < n; i ++) { if(sum1[i-1] == sum1[i]) { sum3[d] ++; } else{ sum2[++d] = sum1[i]; sum3[d] ++; } } flag = 1; printf("Sums of %d:\n",t); backtracking(0); if(flag) printf("NONE\n"); } }