NP完全问题 计蒜客2020蓝桥杯省赛A组模拟赛

思路:因为只是一道填空题,本题可以直接用暴力求解,也可以用dfs求解,这里只介绍dfs的思路。首先,30个元素,每个元素对应着选和不选两种情况。那么,在dfs一开始,我们先不选,一直递归到最后一个元素时再开始选。因为假如我们一开始便选了前面的元素,可能会导致我们还没看后面的元素,递归就结束了,显然这不是我们所期望的。同时应注意一点,因为这里我们定义的是全局变量,所以即使在选择的过程中,累加的和已经等于了我们所期望得到的值,此时最好也不要结束递归,而是等到我们递归到最后一个元素后,再结束递归。避免因为忘记回溯而出现问题。
代码如下

#include <stdio.h>
long long a[30]={70368744177669, 105553116266503, 123145302310920, 61572651155460, 30786325577730, 15393162788865, 78065325572101, 109401406963719, 125069447659528, 62534723829764, 31267361914882, 15633680957441, 78185584656389, 109461536505863, 125099512430600, 62549756215300, 31274878107650, 15637439053825, 78187463704581, 109462476029959, 125099982192648, 62549991096324, 31274995548162, 15637497774081, 78187493064709, 109462490710023, 125099989532680, 62549994766340, 31274997383170, 15637498691585},b[30],sum,f,ans=1019842928705602;
void dfs(int i,long long s)
{
	if(s==ans&&i==30)
	{
		f=1;
		for(int j=0;j<30;j++)
			printf("%lld",b[j]);
		return ;
	}
	if(s>ans||f||i>=30)	return ;
	b[i]=0;
	dfs(i+1,s);
	b[i]=1;
	dfs(i+1,s+a[i]);
}
int main()
{
	dfs(0,0);
	return 0;
}
发布了31 篇原创文章 · 获赞 11 · 访问量 2587

猜你喜欢

转载自blog.csdn.net/guyjy/article/details/104703185
今日推荐