背包问题

输出1到N之间所有相加等于M的数字组合求相加为M的所有组合

解法:由该题可知是典型的背包问题。采用0-1背包的思想,使用递归方法:

 当选择n时,就用剩下的n-1填满 m-n;

 当不选择n是,就用剩下的n-1填满m;

 注意的是,当m=n时,即找到了符合条件的解。


#include<iostream>  
#include<list>  
using namespace std;

list<int> list1;
int total = 0;

void find(int sum, int n)
{
	//递归出口  
	if (sum <= 0 || n <= 0)
		return;

	//输出找到的结果  
	if (sum == n)    //表示找到了一个值  
	{
		list1.reverse();    //使输出顺序更规范  
		for (list<int>::iterator i = list1.begin(); i != list1.end(); i++)
			cout << *i << " ";
		cout << n << endl;
		total++;
		list1.reverse();                                                                        
	}

	list1.push_front(n);
	find(sum - n, n - 1);    //如果放入n,则从剩余n-1个数中填满sum-n  
	list1.pop_front();
	find(sum, n - 1);        //如果不放入n,从n-1个数中填满sum  
}

int main()
{
	int  n,m;
	cout << "Please Input n:" << endl;
	cin >> n;
	cout << "Please Input m:" << endl;
	cin >> m;


	find(m, n);
	cout << total;
	return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alatebloomer/article/details/80352225
个人分类: 面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭