原题链接:蓝桥杯算法训练VIP-和为T
解题思路:
都遍历一遍 ;对于数组里的值 只有两种情况 要么取 要么不取 通过回溯 法遍历每一种情况
根据要求 预先不考虑 数组后面 的数字 因此需倒着遍历并且先遍历不取再遍历取的情况
#include <stdio.h>
long int a[30];
long int b[30];
long int T;
int n;
long int sum=0;
void f(int long t,int pos,int i )
{int j;
if(t==T&&pos!=0&&i<1)//终止条件 注意全部遍历完再进行判断(防止 -1 1 -2 2 3 -3的特例) 并且 不能不选
{sum++;
for(j=pos-1;j>=0;j--)//倒着遍历倒着输出
printf("%ld ",b[j]);
printf("\n");
}
else
{ if(i<1)return ;//遍历到数组第一项还未满足t==T;则返回
f(t,pos,i-1);
t+=a[i];b[pos]=a[i];
f(t,pos+1,i-1);
t-=a[i];
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%ld",&a[i]);
scanf("%ld",&T);
f(0,0,n);
printf("%d\n",sum);
return 0;
}0.0分
11 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复