您的位置:首页 > 其它

每天学习一算法系列(21)(输入两个整数n 和m,从数列1,..n 中随意取几个数使和等于m)

2011-08-06 15:19 495 查看
题目:

编程求解:

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

思路一:

这是比较典型的背包问题,可以用贪心算法来解。

分析:记整数p可以用1,2,3...q的所有不重复数之和表示的组合为C(p,q),则C(p,q)可以表示为以下的组合:

{q} + C(p-q,q-1) (如果q<=m)

或者

C(p,q-1)

即要么包含q,要么不包含q。

代码如下:

/*=============================
Coypright by yuucyf. 2011.08.06
==============================*/

#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;

void FindCombination(int nSum, int nValue)
{
static list<int> listComb;
if(nValue < 0 || nSum < 0)
return;

if (nSum >  0)
{
listComb.push_front(nValue);
FindCombination(nSum-nValue, nValue-1);

listComb.pop_front();
FindCombination(nSum, nValue-1);
}
else
{
cout << "组合:";
for(list<int>::iterator it = listComb.begin(); it != listComb.end(); ++it)
cout << " " << *it;
cout << endl;
}

}

int _tmain(int argc, _TCHAR* argv[])
{
int m, n;
cout<<"请输入你要等于多少的数值m:"<< endl;
cin >> m;
cout<<"请输入你要从1.....n 数列中取值的n:"<< endl;
cin >> n;
cout << "======================" << endl;

FindCombination(m, n);

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