编程求解,输入两个整数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;
}
相关文章推荐
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解) .
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- Java求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包动态规划问题求解)
- 第21 题 2010 年中兴面试题 编程求解: 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- 输入两个正整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.编程求解
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合出来---经典数据结构第21道
- 输入两个整数n和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m,要求将其中所有的可能组合列出来。
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n和m,从数列1,2,3,...,n中随意取几个数,使其和等于m,将其所有可能的组合列出来。 递归求解
- 输入两个整数n和m,从数列1,2,3,...,n中随意取几个数,使其和等于m,将其所有可能的组合列出来。 回溯求解
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- PHP 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 输入两个整数n和m,从数列1,2,3....n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.