栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

51 Nod 1268 和为K的组合(C++ DFS)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

51 Nod 1268 和为K的组合(C++ DFS)

给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。

第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9) 第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)

如果可以,输出:"Yes",否则输出"No"。


这道题可以用动态规划(背包问题)来写但使数据量很小我们直接暴力即可

在进行dfs的时候我们一定要分清楚递归的是谁,这道题就没有分清楚递归的是和还是加的第i

个数而耗费了大量的时间,找到了就直接返回,没找到就进行递归,注意在回溯的时候要恢复现场

这里也即指的是和。

#include
using namespace std;
int v[25];
int book[25];
int n,v1,op=0,sum;
void dfs(int x)
{
	if(sum>v1) return;
	if(sum==v1)
	{
		op=1;
		return;
	 } 
	 for( int i=x+1;i<=n&&!op;i++)
	 {
	    sum+=v[i];
	 	dfs(i);
	 	sum-=v[i];
		}
	 }
int main()
{
	cin>>n>>v1;
	for(int i=1;i<=n;i++)
	{
		cin>>v[i];
	}
	dfs(0);
	if(op==1) cout<<"Yes";
	else cout<<"No";
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号