菜鸟求助,算法问题,请各位大大帮帮忙.在线~~~~~~~~~~~~~~~~~~
有一变量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;
}