《挑战程序设计竞赛》通俗版代码完整实现(一)部分求和

1(系列综述)网上不也是能找到这本老书的例题完整版源码吗,为什么要写这个?

一方面是因为我菜啦,边学边写,这边萌新。
另一方面是……就以部分求和为例吧,目前我在度娘那里是没有找到沿用书上方法还能返回解(e.x. 2,4,7)的源码呢

还有不一定对啦,只是我带了几个数据都没问题,还请各位大佬指教。

2.(原问题)

已知有n个数据(均为正整数)
输入n
给定k
在其中挑出不重复的j个数(这个j用不到的呀,只是为了说明),使得他们的和为k

PS:直接抄是不行的哟,因为……为了便于阅读代码,我特意加了一些输出作为help,这部分要改哦

输入样例:
4
1 2 4 7
13
(敲一下回车)
输出样例
Yes!
2 4 7
#include<iostream>
#define maxn 21 //最多可以搜索20个数
#pragma warning(disable:4996)

using namespace std;

int n;//数据的大小
int i;//计数器
int a[maxn];//用于储存输入的数据
int k;//求和的目标
int book[1000] = { 0 };//用于标记已经写入的点
int result;//用于记录dfs返回的结果 {0,1}

int dfs(int count, int sum)
{
	if (count == n)
	{
		if (sum == k)
		{
			return 1;
		}
		else
		{
			book[count] = 0;
			return 0;
		}
	}
	if (dfs(count + 1, sum))
	{
		return 1;
	}
	else
	{
		book[count] = 1;
		if (dfs(count + 1, sum + a[count]))
		{
			return 1;
		}
		book[count] = 0;
		return 0;
	}
}
int main()
{
	int dfs(int count, int sum);
	printf("请输入搜索的数据的大小:");
	scanf("%d", &n);
	getchar();
	printf("\n请输入搜索的%d个数据:", n);
	for (i = 0;i < n;i++)
	{
		scanf("%d", &a[i]);
		getchar();
	}
	printf("\n请输入目标的和: ");
	scanf("%d", &k);
	getchar();
	printf("计算中\n");
	result=dfs(0, 0);
	printf("计算完成!");
	if (result == 0)
	{
		printf("No!");
	}
	else
	{
		printf("Yes!");
		printf("部分和的解决方案为:");
		getchar();
		for (int i = 0;i <= n;i++)
		{
			if (book[i] != 0)
			{
				printf("%d ", a[i]);
			}
		}
	}
	getchar();
}

好啦,就是这样,顺利地完成了此题~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值