题目描述:2016.8.19改
1)输入两个整数n和sum,要求从数列1,2,3...n中随意取出几个数,使得他们的和等于sum,请将其中所用可能的组合列出来。
思路:n问题转化成n-1问题
考虑是否取第n个数的策略,问题可以转换为一个只与前n-1个数相关的问题,注意取n与不取n的区别。
2)给定整数 a1,a2...an,判断是否可以从中选出若干个数,使得他们的和等于k.思路同上。没有具体思路,望大神指教
c++代码如下:(第1)题)
-
#include<iostream>
-
#include<list>
-
using namespace std;
-
list<int> list1;
-
//using namespace std;
-
////通过不断调用可得findsum(5,4),findsum(1,3),findsum(1,2),findsum(1,2)等
-
void findsum(int sum ,int n)
-
{
-
if (sum <= 0 || n <= 0)//终止条件不要忘了
-
return;
-
if (sum == n)//最后的n不在list1当中
-
{
-
list1.reverse();
-
for (list<int> ::iterator iter = list1.begin();iter != list1.end();iter++)//注意下迭代器的写法
-
{
-
cout << *iter<<"+";
-
}
-
cout << n << endl;//这个莫要忘记
-
list1.reverse();//原书忘记写这个了
-
}
-
list1.push_front(n);
-
findsum(sum-n,n-1);//放n,前n-1个数填满sum-n
-
list1.pop_front();
-
findsum(sum,n-1);//不放n,前n-1 个数填满sum
-
}
-
int main()
-
{
-
int n = 0,sum = 0;
-
cout << "请输入整数n与summ:";
-
cin >> n>>sum;
-
findsum(sum,n);
-
return 0;
-
}
阅读(1109) | 评论(0) | 转发(0) |