回溯算法问题

luoyiaibaobao 2011-03-14 07:36:12
有一集合W,有一整数M,求出集合中加起来等于M的组合。(例如:W{24,7,11,13},M=31.则输出{1,1,0,0}和{0,1,1,1,}),要求要用回溯法,麻烦各位大哥了。
...全文
97 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dege169 2011-03-15
  • 打赏
  • 举报
回复
没详细测试的
#include<stdio.h>
int sum = 0;
int a[4] = {24, 7, 11, 13};
int b[4] = {0, 0, 0, 0};
void test(int n){
if(sum == 31){
for(int k = 0; k < 4; k ++)
printf("%d ", b[k]);
printf("\n");
}
for(int j = n; j < 4; j++){
sum = sum + a[j];
if(sum <= 31){
b[j] = 1;
test(j+1);
b[j] = 0;
}
sum = sum - a[j];
}
}
void main(){
test(0);
}
kkkkkk-00a00 2011-03-15
  • 打赏
  • 举报
回复
很多人把循环放在递归里,如果你知道递归调用机制我相信你不会这样做。
moorsf 2011-03-14
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

#define MAX_N 4

void output( int * num , int * flag , int sum , int pos )
{
int i;

if( pos == MAX_N )
{
if( sum == 0 )
{
cout << "{";
for( i = 0 ; i < MAX_N - 1 ; i++ ) cout << flag[ i ] << ",";
cout << flag[ i ] << "}" << endl;
}
}
else
{
flag[ pos ] = 1;
output( num , flag , sum - num[ pos ] , pos + 1 );
flag[ pos ] = 0;
output( num , flag , sum , pos + 1 );
}
}

int main()
{
int num[]= { 24 , 7 , 11 , 13 };
int flag[ MAX_N ];

output( num , flag , 31 , 0 );

return 0;
}
kkkkkk-00a00 2011-03-14
  • 打赏
  • 举报
回复
#include "iostream.h"
int sum;//保存加法结果
int b[4];//保存一种满足的结果
void output();//输出,不要放到递归里面去
void huisuo(int const w[],int m,int i)//i记录下标
{
if(4==i) return;//数组越界说明前面的都不满足
if(sum==m) output();//满足
if(sum>m) return;
sum=w[i]+sum;//判断放在下一次
b[i]=1;//先认为可以即sum<m
huisuo(w,m,i+1);
//接下来是回溯的思想所在,只有当一种找到或已经不满足才会执行到这里,即回溯,修改当前值,再接着调
b[i]=0;
sum=sum-w[i];
huisuo(w,m,i+1);

}

void output()
{
cout<<"{ "
<<b[0]
<<","
<<b[1]
<<","
<<b[2]
<<","
<<b[3]
<<" }";
}

void main()
{
int const w[]={24,7,11,13};//定义成const避免被修改
huisuo(w,31,0);
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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