解题思路:
通过递归遍历每一种情况,并通过剪枝减少遍历次数节省时间
注意事项:
暴力求解可能得不到满分,但可以得到大多数分值
参考代码:
#include
long long int n;
long long int w[10000];
long long int a[10000];
long long int e = 0;
long long int s[100][100000];
void fama(long long int i, long long int weight)
{
if(i == n)
{
//绝对值
if(weight < 0) weight = -weight;
//判断是否重复
for(long long int i = 0; i < e; i++)
{
if(a[i] == weight) return;
}
a[e] = weight;
e++;
return;
}
//同层出现,return,剪枝
if(s[i][weight]==1)
return;
s[i][weight]=1;
//放左边
fama(i + 1, weight + w[i]);
//放中间
fama(i + 1, weight);
//放右边
fama(i + 1, weight - w[i]);
}
int main()
{
scanf("%lld", &n);
for(long long int i = 0; i < n; i++)
{
scanf("%lld", &w[i]);
}
fama(0, 0);
printf("%lld", e - 1);
return 0;
}
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复