Sum It Up(加和)

zoj1711

题目大意:给出一个和,求出所给数相加等于这个和的所有不同情况

解决:The numbers in each list appear in nonincreasing order, and there may be repetitions.

有序是前提,由于有4 6 4 3 2 2 1 1这样的数据存在,我们必须判断重复的等式

6=3+2+1(第一个1)

或者是6=3+2+1(第二个1)

如何判断呢见代码

//

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

int t,n,num[15],res[15];

bool flag;

void dfs(int start,int current_step,int current_sum)

{

    if(t==current_sum)

    {

        printf("%d",res[0]);

        for(int i=1;i<current_step;i++)printf("+%d",res[i]);

        printf("\n");

        flag=true;

        return;

    }

    for(int i=start;i<n;i++)

    {//判重部分,同一层,除第一个不用判断外,其他的必须和第一个不一样,要不然式子相同了就

       if( i==start || num[i]!=num[i-1])

        {

            res[current_step]=num[i];

            dfs(i+1,current_step+1,current_sum+num[i]);

        }

    }

}

int main()

{



    while( scanf("%d%d",&t,&n),t||n )

    {

        flag=false;

        memset(res,0,sizeof(res));

        for(int i=0;i<n;i++)scanf("%d",&num[i]);

        printf("Sums of %d:\n",t);

        dfs(0,0,0);

        if(!flag)puts("NONE");

    }

    system("pause");

    return 0;

}

  

你可能感兴趣的:(SUM)