首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

初学者,算法有关问题,请各位大大帮帮忙.在线~

2012-02-05 
菜鸟求助,算法问题,请各位大大帮帮忙.在线~~~~~~~~~~~~~~~~~~有一变量A60(可变),一组数据分别为10,20,30,

菜鸟求助,算法问题,请各位大大帮帮忙.在线~~~~~~~~~~~~~~~~~~
有一变量A=60   (可变)   ,   一组数据分别为   10,20,30,40....   ,这组数据可以单个翻倍和想加,要求从这组数据中得到变量A=60   的所有算法.
如   A=60   时   ,输出如下结果:
                              10*6
                              20*3
                              30*2
                              10*4+20
                              10*3+30
                              10*2+40
                              10+20+30
                              20+40
我是个菜鸟,请各位大大帮帮忙.谢谢哦~~~~~~~~~~

[解决办法]
背包问题。

对A较小的情形,可以用动态规划解决;若A很大,可以用回溯+剪枝的办法来解决。


[解决办法]
要列出所有的可能,就需要遍历啦.
[解决办法]
用回溯+剪枝实现:

/*
求出在某集合中,和为某值的所有组合
*/

#include <iostream>

using namespace std;

struct Node{
int e;
int freq;
};

struct Stack{
Node node[20];
int len;
}stack;

void f( int curr_sum, int pos, int *list, int Max_len, int sum )
{
int i;
if( curr_sum==sum )
{
for( i=0; i <stack.len-1; ++i )
{
if( stack.node[i].freq> 1 )
cout < <stack.node[i].e < < "* " < <stack.node[i].freq < < " + ";
else
cout < <stack.node[i].e < < " + ";
}
if( stack.node[stack.len-1].freq> 1 )
cout < <stack.node[stack.len-1].e < < "* " < <stack.node[stack.len-1].freq < <endl;
else
cout < <stack.node[stack.len-1].e < <endl;
return ;
}

int t=2; //只是随便一个值,以满足下面for中的t的初始条件
for( i=pos; t> =1 && pos <Max_len; ++i )
{
t=(sum-curr_sum)/list[i];
for( ; t> 0; --t )
{
stack.node[stack.len].e=list[i];
stack.node[stack.len].freq=t;
++stack.len;
f( curr_sum+t*list[i], pos+1, list, Max_len, sum );
--stack.len;
}
if( pos+1 <Max_len )
f( curr_sum, pos+1, list, Max_len, sum );
}
return ;

}


int main( )
{
int list[]={10,20,30,40};//list[]中的元素必须是递增的,否则,可能漏掉部分解
int Max_len=sizeof(list)/sizeof(list[0]);
int sum=60;

f( 0, 0, list, Max_len, sum );

return 0;
}

热点排行