一个算法问题 找数字之和的

vvilp 2008-11-06 10:56:57
有这样一个算法的问题 初学 想不明白 请大家明示啊

给一个数组 比如存20个数字 给定一个数字 比如100

如何找出20个数组中的哪几个相加等于100?

用什么方法呢 最好给一下大致的思路

...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
vvilp 2008-11-07
  • 打赏
  • 举报
回复
谢谢学习l饿
jakqigle 2008-11-06
  • 打赏
  • 举报
回复
子集和问题
简单想是:
例如:

Array[1:n]={4,2,2,6,5}
c = 10;

sum = 0;
tmpAry[n]
//先判断特例
sum(Array[1:n]) = c?
如果等于找到答案
否则继续
for(int i= 1~n)
for(int j=1~n)
if( j!= i)
{
sum += Array[j];
if( sum > c)
{
insert(Array[j]) into tmpAry[n];
break;
}
else if( sum == c)找到答案
}



太乙 2008-11-06
  • 打赏
  • 举报
回复


if(a[front]==13)
{
int mm;
mm=1223;
}


刚发现的问题,呵呵,上面的代码是我调试的时候加上去的,可以删除了!嘿嘿~~
太大意了!

太乙 2008-11-06
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/************************************************************************/
/* 递归 */
/************************************************************************/
void getResult(int a[],int size,int N,int res[],int resSize)
{
if (size==1)
{
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}
return;
}
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}

res[resSize++] = a[0];
getResult(&a[1],size-1,N-a[0],res,resSize);
resSize--;
getResult(&a[1],size-1,N,res,resSize);
}
/************************************************************************/
/* 非递归 */
/************************************************************************/
void getResult(int a[],int size,int N)
{
vector<int> iv;
vector<int> indexv;
int back=0;
int sum=0;
while (back<size)
{
int front = back;
while (front!=size)
{
if(a[front]==13)
{
int mm;
mm=1223;
}
if (sum+a[front]<N)
{
iv.push_back(a[front]);
indexv.push_back(front);
sum+=a[front];
}
else if (sum+a[front]==N)
{
for (vector<int>::const_iterator it = iv.begin();it!=iv.end();it++)
{
cout<<*it<<" ";
}
cout<<a[front]<<endl;
if (iv.empty())
{
break;
}
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();
if (iv.empty())
{
break;
}

}
else
{
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();

if (iv.empty())
{
break;
}
}
front++;
}
sum = 0;
iv.clear();
indexv.clear();
back++;
}
}

void main()
{
int a[] = {1,1,3,5,8,9,1,10,13};
int b[sizeof(a)/sizeof(int)];
int N = 13;
sort(a,a+sizeof(a)/sizeof(int));
getResult(a,sizeof(a)/sizeof(int),13,b,0);
getResult(a,sizeof(a)/sizeof(int),13);
}


以前写的背包程序,也就跟lz要求的一样!

其中:N就相当于lz说的100
a就相当于lz说的数组

用了递归和非递归实现~!

呵呵,凑合看吧~~

zapdos 2008-11-06
  • 打赏
  • 举报
回复
背包问题+百度
hzc191025 2008-11-06
  • 打赏
  • 举报
回复
没有思路,帮顶!
vvilp 2008-11-06
  • 打赏
  • 举报
回复
谢谢楼上 我先看一下
huntrose 2008-11-06
  • 打赏
  • 举报
回复
不是我装B,这个,我想回答的是深度优先搜索
至于具体的怎么做…… 由于今晚想看电影,不帮你了

65,211

社区成员

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

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