emm就直接看的前辈的了。
唉
#include <stdio.h>
#include <string.h>
#include <algorithm>
//我不成熟的想法是两成遍历
//但感觉会时间超限,但没有先想到深度搜索
using namespace std;
int n,t;
int num[101];
//存放输入情况
int r[101];
//记录可能情况
bool flag;
void dfs(int len,int k,int last)
{
int result;
if(last==0){
flag=false;
for(int i=0;i<len;i++)
if(i==0)printf("%d",r[i]);
else printf("+%d",r[i]);
printf("\n");
return ;
}
for(int i=k;i<n;i++){
if(i==k||num[i]!=num[i-1]&&last-num[i]>=0)// 去除重复的操作
{
//这里的i==k或者后面情况是
//为了保证遇到前后相同时,自身不会被重用
//并且还能使用后面的情况
r[len]=num[i];
dfs(len+1,i+1,last-num[i]);
}
}
}
int main()
{
while(scanf("%d%d",&t,&n)!=EOF)
{
memset(r,0,sizeof(r));
memset(num,0,sizeof(num));
if(t==n&&n==0)break;
flag=true;
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
printf("Sums of %d:\n", t);
dfs(0,0,t);
if(flag)printf("NONE\n");
}
return 0;
}
标签:last,1133,len,ZCMU,int,flag,num,include
From: https://www.cnblogs.com/hai-zei/p/18228647