子集和问题~~~~~~~~~~~~

flying_dancing 2005-05-01 10:12:27
结果有点问题

#include <iostream>
using namespace std;

const int MAX=11;
const int b[MAX]={1,2,3,4,5,8,11,23,45};
int x[MAX]={0};
int sum;

int Sum();
int SumOfSub(int ,int ,int );
void Display(int *);

int main()
{
cout<<"enter the sum:"<<endl;
cin>>sum;
int s=0,k=0,r;
r=Sum();
// cout<<r<<endl;
SumOfSub(s,k,r);
system("pause");
return 0;
}

int Sum()
{
int s=0;
for(int i=0;i<MAX;i++)
{
s+=b[i];
}
return s;
}

int SumOfSub(int s,int k,int r)
{
x[k]=1;
if(s+b[k]==sum)
{
Display(x);
}
else
{
if(s+b[k]+b[k+1]<=sum)
SumOfSub(s+b[k],k+1,r-b[k]);
if(s+r-b[k]>=sum&&s+b[k+1]<=sum)
{
x[k]=0;
SumOfSub(s,k+1,r-b[k]);
}
}
return 0;

}

void Display(int *x)
{
for(int i=0;i<MAX;i++)
{
if(x[i]==1)
cout<<b[i]<<"\t";
}
cout<<endl;
}
-_-
大家帮个忙 谢谢
...全文
181 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_dancing 2005-05-02
  • 打赏
  • 举报
回复
我写的这个是定长的回朔法.........
不知那个高手肯帮写个不定长的回朔法看看.........
因为定长的是2^ n 而不定长的是 n! 当然其中 也包括了剪枝.............

苦等!!!!!!!!!!!!
flying_dancing 2005-05-02
  • 打赏
  • 举报
回复
我明白 我那错了...........
谢谢你的提示........
但你这样做效率比我的低.........
int SumOfSub(int s,int k,int r)
{
x[k]=1;
if(s+b[k]==sum)
{
Display(x);
}
if(s+b[k]+b[k+1]<=sum)
SumOfSub(s+b[k],k+1,r-b[k]);
x[k]=0;
if(s+r-b[k]>=sum&&s+b[k+1]<=sum)
{

SumOfSub(s,k+1,r-b[k]);
}
/* if(s+b[k]<sum)
SumOfSub(s+b[k],k+1,r-b[k]);
x[k]=0;
SumOfSub(s,k+1,r-b[k]);*/
return 0;
}
-_-
=_=..............
astrophor 2005-05-02
  • 打赏
  • 举报
回复
今天还是过节......
flying_dancing 2005-05-02
  • 打赏
  • 举报
回复
今天睡得好爽。。。。
但看到没人理我,就他一个好可怜。。。
定长的其实就是YN
不定长的。。。。。-_-难说。。。。
astrophor 2005-05-02
  • 打赏
  • 举报
回复
不定长的回朔法的基本思想是什么?
期待高手解答
astrophor 2005-05-02
  • 打赏
  • 举报
回复
看了会,明白了,掉了个东西

int SumOfSub(int s,int k,int r)
{
if(r<0) return 0;
x[k]=1;
if(s+b[k]==sum)
{
Display(x);
}

if(s+b[k]+b[k+1]<=sum)
SumOfSub(s+b[k],k+1,r-b[k]);

if( (s+r-b[k])>=sum && (s+b[k+1])<=sum )
{
x[k]=0;
SumOfSub(s,k+1,r-b[k]);
}
x[k]=0;       //加上这个就可以了
return 0;
}

astrophor 2005-05-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

const int MAX=11;
const int b[MAX]={1,2,3,4,5,8,11,23,45};
int x[MAX]={0};
int sum;

int Sum();
int SumOfSub(int ,int ,int );
void Display(int *);

int main()
{
cout<<"enter the sum:"<<endl;
cin>>sum;
int s=0,k=0,r;
r=Sum();
// cout<<r<<endl;
SumOfSub(s,k,r);
return 0;
}

int Sum()
{
int s=0;
for(int i=0;i<MAX;i++)
{
s+=b[i];
}
return s;
}

int SumOfSub(int s,int k,int r)
{
if(r<0) return 0;
x[k]=1;
if(s+b[k]==sum)
{
Display(x);
}

if(s+b[k]+b[k+1]<=sum)
SumOfSub(s+b[k],k+1,r-b[k]);

// if(s+r-b[k]>=sum&&s+b[k+1]<=sum)
// {
x[k]=0;
SumOfSub(s,k+1,r-b[k]);
// }
return 0;
}

void Display(int *x)
{
for(int i=0;i<MAX;i++)
{
if(x[i]==1)
cout<<b[i]<<"\t";
}
cout<<endl;
}
这个是不是,偶不太懂算法
astrophor 2005-05-01
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

const int MAX=11;
const int b[MAX]={1,2,3,4,5,8,11,23,45};
int x[MAX]={0};
int sum;

int Sum();
int SumOfSub(int ,int ,int );
void Display(int *);

int main()
{
cout<<"enter the sum:"<<endl;
cin>>sum;
int s=0,k=0,r;
r=Sum();
// cout<<r<<endl;
SumOfSub(s,k,r);
system("pause");
return 0;
}

int Sum()
{
int s=0;
for(int i=0;i<MAX;i++)
{
s+=b[i];
}
return s;
}

int SumOfSub(int s,int k,int r)
{
if(k>=8) return 0;
x[k]=1;
if(s+b[k]==sum)
{
Display(x);
}
/* else
{
if(s+b[k]+b[k+1]<=sum)
SumOfSub(s+b[k],k+1,r-b[k]);
if(s+r-b[k]>=sum&&s+b[k+1]<=sum)
{
x[k]=0;
SumOfSub(s,k+1,r-b[k]);
}
}*/
if(s+b[k]<sum)
SumOfSub(s+b[k],k+1,r-b[k]);
x[k]=0;
SumOfSub(s,k+1,r-b[k]);
return 0;
}

void Display(int *x)
{
for(int i=0;i<MAX;i++)
{
if(x[i]==1)
cout<<b[i]<<"\t";
}
cout<<endl;
}
flying_dancing 2005-05-01
  • 打赏
  • 举报
回复
自己顶一下..........分了.....-_-
如果谁帮忙解决了 再
for(int i=0;i<50;i++)
++s;
当然是s=20了...........

64,642

社区成员

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

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