题目大意:给出一个和,求出所给数相加等于这个和的所有不同情况
解决: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;
}
浙公网安备 33010602011771号