有个问题 求算法

genguyige 2010-03-25 05:20:16
假设有N个按照升序排列的数,然后想从这个N个数里面找到M个数,使他的总和为num.
我按照回溯递归的方法写了一个,但是有点问题,虽然我也知道问题的地方在哪里,但是不知道怎么去改……
希望大虾帮我……

#include<iostream>
#include<string.h>
using namespace std;
int sum=0,j=0;
int d[100];//这个数组是用来存储合适的数 如果暂时合适就放进去
int print(int a[],int n);
int digui(int a[][2],int num,int n);
int main()
{
int ch[100][2];
int n;
memset(d,0,sizeof(d));
cin>>n;//n的意思是有N个数
int num;//num就是要找到的那个总和数
cin>>num;
for(int i=0;i<n;i++)//为了简单,现在我用循环来产生着N个数
{
ch[i][1]=(i+1)*10;
ch[i][0]=0;//这里是表示这个数没有被用过 如果用过了以后我就把这个值变成1现在初始化是0
}
digui(ch,num,n);
return 1;
}
int print(int a[],int n)//如果找到了正确的答案,就调用这个函数打印出来
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 1;
}
int digui(int a[][2],int num,int n)
{
for(int i=0;i<n;i++)
{
if(a[i][0]==0)//如果没有被用过 那么进去
{
if(sum+a[i][1]==num)//如果刚好是要找到的那组解……
{
d[j]=a[i][1];
a[i][0]=1;
j++;
print(d,j);
return 1;
}
else if(sum+a[i][1]>num)//如果不是 总和已经大于我要找的数……
{
a[i][0]=0;
d[j]=0;
j--;
return 0;
}
else //如果是部分解那么就执行递归 往后找
{
d[j]=a[i][1];
a[i][0]=1;
j++;
sum+=a[i][1];
digui(a,num,n);
}
}
}
return 1;
}
...全文
128 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SiGoYi 2010-03-31
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~~~~~
Who_know_me 2010-03-31
  • 打赏
  • 举报
回复
mark~~
回头来看看
wesweeky 2010-03-30
  • 打赏
  • 举报
回复
就是个背包问题
赵4老师 2010-03-30
  • 打赏
  • 举报
回复
参考这个吧
//求从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();
}
genguyige 2010-03-30
  • 打赏
  • 举报
回复
这位大叔 能适当帮我加加注释吗?小弟才疏学浅 实在没看懂有些东西 看懂了我就结贴
genguyige 2010-03-25
  • 打赏
  • 举报
回复
其实我也想说这个是背包问题 不过网上找了半天也不没有这个问题的解法 所以上这里来请教了
太乙 2010-03-25
  • 打赏
  • 举报
回复
这不就是背包问题么??
太乙 2010-03-25
  • 打赏
  • 举报
回复

#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 (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);
}


haoxiang12345 2010-03-25
  • 打赏
  • 举报
回复
你可以搜索下关于n数个任取m个数的所有组合的回溯算法
genguyige 2010-03-25
  • 打赏
  • 举报
回复
大虾帮我看看 撒

64,654

社区成员

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

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