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;
}

  

原文地址:https://www.cnblogs.com/hpustudent/p/2133108.html