求一个计算数字和的算法

gattuso8 2008-11-12 06:31:19
加精
我有个长度一定的int数组
每个数组成员都已经初始化(没有负数)

现在我想从数组里挑出任意多个成员来
使得他们的值加起来能够等于某个数
(当然 此数一定大于每一个数,小于数组每个数的和)

如果不能找到完全符合的
也希望找到最接近要求的(假设比希望得到的数大多少和小多少是一样的)。

不知道说清楚没有。。
...全文
3888 140 打赏 收藏 转发到动态 举报
写回复
用AI写文章
140 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming_311 2012-06-25
  • 打赏
  • 举报
回复
mark
demonYJ 2012-04-29
  • 打赏
  • 举报
回复
现在算法什么的,对我来说都是浮云,全都是看到不知道啊!
sheldenwade1 2012-04-29
  • 打赏
  • 举报
回复
dp解决吧
ioaq 2012-03-24
  • 打赏
  • 举报
回复
学习了
zsl3399 2012-03-17
  • 打赏
  • 举报
回复
学习了,各有各的算法,不错哈。
疼你 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 crazying111 的回复:]

1 先排序

2 找出所有小于目标数的数存入有序数组a【】

2 做一个栈

3.将a【】中的数从小到大依次入栈并判断 如在数之和是大于目标数,若大于出栈一位,再入栈下一位数

以此类推
[/Quote]

我也觉得可以试试用栈试试。。。
JackBurd 2012-03-15
  • 打赏
  • 举报
回复
59L 的算法不错。
liuhex 2011-06-13
  • 打赏
  • 举报
回复
mark
jasmine 2011-04-20
  • 打赏
  • 举报
回复
高人真是多的吓人
乖乖的上帝 2011-04-20
  • 打赏
  • 举报
回复
努力学习中
peijch02 2011-04-06
  • 打赏
  • 举报
回复
惭愧,只能慢慢看懂一些,自己现在肯定写不出来,
要加油哦。
gergerman 2011-03-15
  • 打赏
  • 举报
回复
mark
dunhomwe123 2011-03-15
  • 打赏
  • 举报
回复
up up
善水999 2011-03-15
  • 打赏
  • 举报
回复
学习了。。。
guodongbin2011 2011-03-15
  • 打赏
  • 举报
回复
此帖火了
赵4老师 2011-03-14
  • 打赏
  • 举报
回复
仅供参考
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
srand((unsigned)time(NULL));
n=MINN+rand()%(MAXN-1);
for (i=0;i<n;i++) {
x[i]=-10+rand()%21;
printf("%d,",x[i]);
}
printf("\n");
sort(&x[0],&x[n]);
do {
for (i=2;i<=n;i++) {
sum=0;
k=n/2-i/2;
for (j=k;j<k+i;j++) {
sum+=x[j];
}
if (10==sum) {
for (j=k;j<k+i;j++) {
if (j==k+i-1) {
printf("%d==10\n",x[j]);
} else {
printf("%d+",x[j]);
}
}
printf("YES\n");
return 1;
}
}
} while (next_permutation(&x[0],&x[n]));
printf("NO\n");
return 0;
}

//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
#include <conio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;

if (e>s) e=s;
for (i=e;i>=b;i--) {
if ((i+b)*(i-b+1)/2<s) break;
o[d]=i;
if (s-i<=0) {
n++;
printf("%8ld:",n);
for (j=0;j<=d;j++) printf("%d ",o[j]);
printf("\n");
} else {
if (d+1<1000) combsum(b,i-1,s-i,d+1);
else {
printf("Error:Too deep.\n");
return;
}
}
}
}
void main() {
clrscr();
printf("Input Begin,End,Sum:");
scanf("%d,%d,%d",&Begin,&End,&Sum);
n=0L;
combsum(Begin,End,Sum,0);
printf("Total:%ld\n",n);
getch();
}
hrx1989 2011-03-14
  • 打赏
  • 举报
回复
真是太厉害了吧。。。
kenyen 2011-02-13
  • 打赏
  • 举报
回复
MARK~~~~~~~~~~~~~~~~~~
sparklxd 2011-01-29
  • 打赏
  • 举报
回复
学习了
cloud_xu 2010-11-04
  • 打赏
  • 举报
回复
学习了
加载更多回复(120)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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