输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数

来源:互联网 发布:男生基本款衬衫 知乎 编辑:程序博客网 时间:2024/04/28 03:11

本文转自:http://blog.csdn.net/wuzhekai1985/article/details/6728657

 

问题描述:输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来。

      思路:这个问题其实背包问题的变形,本文给出两种解法。

      解法一:用递归,效率可能低了点。假设问题的解为F(n, m),可分解为两个子问题 F(n-1, m-n)和F(n-1, m)。对这两个问题递归求解,求解过程中,如果找到了符合条件的数字组合,则打印出来。

      解法二:用循环,其实就是枚举所有组合。对于n ,组合数应该为2^n。我们可以用一个数字 i 来表示组合。如果i = 5,其二进制形式为101,相应的组合为{1, 3}。也就是说,二进制的每一位都代表一个数字,bit0代表数字1,bit1代表数字2,依次类推。当某位为1,表示选中了该位所表示的数字。

      参考代码:                                      为了更好地理解,可以参看另一种递归解法

 

 

       给出一段测试程序:

int main(){int n, m;cout<<"please enter n and m : ";cin>>n>>m;int *flag = new int[n];for(int i = 0; i < n; i++)flag[i] = 0;BagProblem_Solution1(n, m, flag, n);cout<<endl;BagProblem_Solution2(n, m);delete [] flag;return 0;}


 

 

0 0