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;
    }
    
  • 相关阅读:
    win7开启Administrator账户
    二叉树遍历
    使用NAnt提高工作效率(二)
    系统服务的最简单实现
    右键附加启动命令行
    C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
    百度原CTO李一男经典语录
    Sql开发技巧
    使用NAnt提高工作效率(一)
    对获取config文件的appSettings节点简单封装
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14848000.html
Copyright © 2011-2022 走看看