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();
}
好啦,就是这样,顺利地完成了此题~