您的位置:首页 > 编程语言

编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)

2018-02-28 17:40 537 查看

题目:输入两个整数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++)
{
if(flag[i] == 1)
{
cout << i + 1 << " ";
}
}
cout << endl;
flag[m - 1] = 0; //不选m,继续递归。比如n = 10, m = 8,求出{1,7}后,仍需继续,{1,3,4}和{1,2,5}都是解
F(m - 1, m, flag, len);
}
}

int _tmain(int argc, _TCHAR* argv[])
{

int n, m;
cout<<"please enter n and m : ";
cin>>n>>m;

int *flag = new int
;
for(int i = 0; i < n; i++)
{
flag[i] = 0;
}
F(n, m, flag, n);
cout<<endl;

delete [] flag;
system("pause");
return 0;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐