Chinaunix首页 | 论坛 | 博客
  • 博客访问: 505658
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-06 10:22:57

题目描述: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)题)

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include<list>
  3. using namespace std;
  4. list<int> list1;
  5. //using namespace std;
  6. ////通过不断调用可得findsum(5,4),findsum(1,3),findsum(1,2),findsum(1,2)等
  7. void findsum(int sum ,int n)
  8. {
  9.     if (sum <= 0 || n <= 0)//终止条件不要忘了
  10.         return;
  11.     if (sum == n)//最后的n不在list1当中
  12.     {
  13.         list1.reverse();
  14.         for (list<int> ::iterator iter = list1.begin();iter != list1.end();iter++)//注意下迭代器的写法
  15.         {
  16.             cout << *iter<<"+";
  17.         }
  18.         cout << n << endl;//这个莫要忘记
  19.         list1.reverse();//原书忘记写这个了
  20.     }
  21.     list1.push_front(n);
  22.     findsum(sum-n,n-1);//放n,前n-1个数填满sum-n
  23.     list1.pop_front();
  24.     findsum(sum,n-1);//不放n,前n-1 个数填满sum
  25. }
  26. int main()
  27. {
  28.     int n = 0,sum = 0;
  29.     cout << "请输入整数n与summ:";
  30.     cin >> n>>sum;
  31.     findsum(sum,n);
  32.     return 0;
  33. }
阅读(1071) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~