题目:输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
解法:运用递归的方法来进行处理,首先我先解释一下我的理解
假如我们取n=10,m=8;
我们列出 1 2 3 4 5 6 7 8 9 10
我们建立一个选择数组,数组的长度即为n的大小
数组里的每个元素与1..n 一 一 对应
数组元素的表示只有两种情况:1代表选择了其对应的数,0则代表未选择对应的数
我们从这堆数的左右边开始选择
10,9是肯定是不选的(当然这是n>m的情况,我们可以使n=m,在进行以下)
我们可以选8或不选8
7,6...等等都是这样
直到选择的数相加为m
我们输出选择的数字
即分为选n F(n-1,m-n)
不选n F(n-1,m)
进行递归
代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
void F(int n, int m, int *flag, int len)
{
if(n < 1 || m < 1)
{
return;
}
if(n < m)
{
flag[n - 1] = 1;
F(n - 1, m - n, flag, len); //选了n
flag[n - 1] = 0;
F(n - 1, m, flag, len); //不选n
}
else
{
flag[m - 1] = 1; //n >= m,选中m即可(n = m)
for(int i = 0; i < len; i++)