有一组数,找出其中和等于指定值的集合

孙亖
博客专家认证
2009-11-23 04:15:00
比如有20个数字,每个数字不相同,着20个数字总和2000,在这一组数据中和接近500的集合,求一个快速的算法。
...全文
378 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
baijiayue123 2009-12-19
  • 打赏
  • 举报
回复
唉 ,烦死啦 ,太麻烦啦 ···
baijiayue123 2009-12-19
  • 打赏
  • 举报
回复
唉 ,烦死啦 ,太麻烦啦 ···
baijiayue123 2009-12-19
  • 打赏
  • 举报
回复
唉 ,烦死啦 ,太麻烦啦 ···
KingWolfOfSky 2009-12-19
  • 打赏
  • 举报
回复
mark,看看~~
MasterLuo 2009-12-15
  • 打赏
  • 举报
回复
输入数据个数:5
输入各个数字:12 12 12 13 14
输入要组合的数:38
子集中的数为:14,12,12

输入数据个数:6
输入各个数字:1 2 3 4 8 12
输入要组合的数:25
子集中的数为:12,8,3,2



#include <cstdio>
#include <cstring>
using namespace std;

//定义输入数据的最大个数
#define MAX_NUMBER 20
//定义查找数据的最大值
#define MAX_VALUE 2000

int number[MAX_NUMBER];
int ans[MAX_VALUE + 1];
int next[MAX_VALUE + 1];
//数据个数与要查找的值
int n, value;

int main() {
printf("输入数据个数:");
scanf("%d", &n);
printf("输入各个数字:");
for(int i = 0; i < n; ++i) {
scanf("%d", &number[i]);
}
printf("输入要组合的数:");
scanf("%d", &value);
memset(ans, 0, sizeof(ans));
memset(next, -1, sizeof(next));
next[0] = 0;
ans[0] = 1;

for(int i = 0; i < n; ++i) {
for(int j = value - number[i]; j >= 0; --j) {
if(ans[j + number[i]] == 0 && ans[j] == 1) {
ans[j + number[i]] = 1;
next[j + number[i]] = j;
}
}
}
if(ans[value] == 0) {
printf("不存在这样的子集!");
} else {
printf("子集中的数为:");
for(int j = value; j > 0; ) {
printf("%d,", j - next[j]);
j = next[j];
}
}
return 0;
}
lzy18lzy 2009-12-15
  • 打赏
  • 举报
回复
http://acm.nuaa.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1131


称为:静态bst
数据之巅 2009-12-15
  • 打赏
  • 举报
回复
很有难度哦。。。上次Java SE板块有一个和你类似的帖子,是找出和等于100的集合。。。。
woshishabi1984 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 litaoye 的回复:]
反正这道题用不上量子计算机,呵呵,随便一台都可以解!
开一个500 * 20的数组,如果解大于500也可以的话,开一个1000 * 20的数组就足够了
用DP解背包,然后在DP的过程中,每个记录保存一下上一级的值,求得最优之后反过来推算一下一个解就行了!

引用 10 楼 woshishabi1984 的回复:
SUBSET问题是NPC的,没有多项式时间的算法,不用想了,除非你用量子算法,不过现在你手上不会有量子计算机。

[/Quote]
恩,此类问题一般就是DP+备忘录+剪枝,您说的对。
绿色夹克衫 2009-11-30
  • 打赏
  • 举报
回复
反正这道题用不上量子计算机,呵呵,随便一台都可以解!
开一个500 * 20的数组,如果解大于500也可以的话,开一个1000 * 20的数组就足够了
用DP解背包,然后在DP的过程中,每个记录保存一下上一级的值,求得最优之后反过来推算一下一个解就行了!

[Quote=引用 10 楼 woshishabi1984 的回复:]
SUBSET问题是NPC的,没有多项式时间的算法,不用想了,除非你用量子算法,不过现在你手上不会有量子计算机。
[/Quote]
woshishabi1984 2009-11-30
  • 打赏
  • 举报
回复
SUBSET问题是NPC的,没有多项式时间的算法,不用想了,除非你用量子算法,不过现在你手上不会有量子计算机。
孙亖 2009-11-30
  • 打赏
  • 举报
回复
都是非负数
Mirana_NightShade 2009-11-26
  • 打赏
  • 举报
回复
题目要求可以清楚点吗
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 northwolves 的回复:]
You Got it
用一个a[1000]的数组解决这个问题。
采用动态规划的一种变种。
具体思想 以空间换时间

然后
对所有数字循环和加到数组中去。
维护一少于500的数和所有的list+大于500数的一个和。
直到所有的数,都添加完毕。结果就出来了。
[Quote=引用 5 楼 berryluo 的回复:]
如果所有数字都为非负整数,很容易做到复杂度不大于20*1000=2*10^4的算法,不知道算高效不?
LZ的20个数字都为非负整数么?
[/Quote]
komai908 2009-11-25
  • 打赏
  • 举报
回复
我也很想知道
berryluo 2009-11-24
  • 打赏
  • 举报
回复
如果所有数字都为非负整数,很容易做到复杂度不大于20*1000=2*10^4的算法,不知道算高效不?
LZ的20个数字都为非负整数么?
northwolves 2009-11-23
  • 打赏
  • 举报
回复
1048576种组合,穷举也不打紧的
绿色夹克衫 2009-11-23
  • 打赏
  • 举报
回复
LZ看看01背包吧,网上资料很多!
孙亖 2009-11-23
  • 打赏
  • 举报
回复
输出一组即可
绿色夹克衫 2009-11-23
  • 打赏
  • 举报
回复
如果有多组的话是否随便输出1组就可以?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧