zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    MS面试归来:)
    准备出发到成都
    线程的同步机制(zz)
    Windows Vista(zz)
    这几天上海热晕了
    微软官方:Vista硬件要求指南(zz)
    有趣的递归缩写(Recursive acronym)
    《三国志》生僻人名读法集(zz)
    Git bash常用命令
    各大输入法分类词库内部格式的简单比较
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14848000.html
Copyright © 2011-2022 走看看