输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m

转载自:http://blog.sina.com.cn/s/blog_7571423b01016707.html

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

分析:

       主要思想:分治,即m=idx+m-idx
       从最大数字n开始查找,然后逐渐后退,但每次查找只会在比当前数字大的方向进行组合尝试,这样可以保证找到的组合不会重复。
参考代码

 
1: #include
2: #include
3: #include<<SPAN style="COLOR: #0000ff">string.h>
4: void myDump(int aux[], int n)
5: {
6: for (int i=0; i
7: if (aux[i]) // 0标示未选择该数字
8: printf("=", i+1);
9: printf("\n");
10: }
11:
12: void helper(int dest, int idx, int aux[], int n)
13: {
14: if (dest == 0) // m减为0时,找到一个组合,输出
15: myDump(aux, n);
16:
17: // 递归结束条件:dest=0,说明找到一个组合;dest<0,说明该组合不满足(和大于m);
18: // 如果idx=n,则说明已达到规定的最大数字(范围为1-n)
19: if (dest <= 0 || idx==n)
20: return;
21:
22: helper(dest, idx+1, aux, n);
23: aux[idx] = 1; // 标示选择了数字idx+1
24:
25: //因为已经选择了idx,即选择了数字idx+1,所以将m减去idx+1
26: helper(dest-idx-1, idx+1, aux, n);
27: aux[idx] = 0; //无论结果是否满足,都需要取消原来已选择的数字idx+1,然后尝试另一种组合
28: }
29:
30: void findCombination(int n, int m)
31: {
32: if(n>m) //因为和为m,所以大于m的数肯定不行
33: n=m;
34:
35: int* aux=new int[n];
36: memset(aux, 0, n*sizeof(int));
37:
38: helper(m, 0, aux,n);
39:
40: delete[] aux;
41: }
42:
43: int main()
44: {
45: int n,m;
46: scanf("%d,%d",&m,&n);
47:
48: findCombination(n,m);
49:
50: getchar();
51: return 0;
52: }

 

*****************************************************************************

 解题思路:
    显而易见, 当n>m时, 肯定存在满足题目要求的子集. 由于数列1,2,...,n是正整数数列, 这使得所有的大于m的数加上数列最小元素1都会大于m, 所以当n>m时我们只需要考虑子数列1,2,...,m即可.
     当n<=m时,我们需要搜索1,2,...,n中符合条件的子集. 实际上, 我们可以将原问题分解成两个子问题:
子问题一: 在n个数的数列,我们取n, 然后原问题就变为找出1,2,...,n-1中和为m-n的所有子集,然后将所有的子集都加上元素n就得到了原问题的部分解集;
子问题二: 我们不取n, 原问题就变为找出1,2,...,n-1中和为m的所有子集.
联合两个子问题的解, 便得到了原问题的解集.

    我们用subsets( n, m) 表示原问题, 那么原问题可表示为子问题 subsets(n-1, m) 和subsets( n-1, m-n)的解集的并集.
    即:   subsets( n, m)  = subsets(n-1, m) U subsets( n-1, m-n)
    实际中,可采用回溯的方法进行求解. 后面附有完整的代码.

    实际的搜索方法类似于二叉树的方法, 去除不符合条件的解. 例如下面的二叉树就表示了1,2,...,n的全组合的求解过程. 左边分支表示取,右边的分支表示舍. 针对于0-1背包问题, 八皇后问题, 射击十次命中九十环的打法问题等等, 则需要剪除掉一些不符合条件的子树.

 

 

#include <stdio.h>
#include <assert.h>
#include <time.h>

#define MAXN 1000



int stack[MAXN];
int top = -1;
void push( int e )
{
 assert( top < MAXN );
 stack[++top] = e;
}

void pop( )
{
 assert( top > -1 );
 top--;
}

void clear()
{
 top = -1;
}

void printStack( )
{
 int i=top;
 while( i>-1 )
  printf("%d\t", stack[i--] );
 printf("\n");
}


int subsets( int n, int m )
{
 int i;
 int num=0;
 int flag = 1;

 
 if( n > m )
  n = m;

 
 for( i = n; flag && i>=1; i-- )
 {
  
  push( i );
  
  
  if( m-i == 0 )
  {
   num++;
   printStack();
  }
  else
  {
   
   
   if( (i-1)*i/2 < (m-i) )
   {
    pop();
    flag = 0;
    continue;
   }

   
   num += subsets( i-1, m-i );
  }
  
  
  pop();
 

 return num;
}

void testSubsets()
{
 assert( 1 == subsets( 1, 1 ) );
 printf( "\n\n" );
 assert( 0 == subsets( 1, 2 ) );
 printf( "\n\n" );
 assert( 3 == subsets( 5, 6 ) );
 printf( "\n\n" );
 assert( 5 == subsets( 7, 7 ) );
}

int main()
{
 testSubsets( );

 clock_t start = clock();
 subsets( 50, 50 );
 clock_t duration = clock() - start;
 printf("it takes %d seconds\n", duration/CLOCKS_PER_SEC );
 return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

在开始之前&#xff0c;首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中&#xff0c;而是在 System.IO.Ports NuGet 包中。之所以在这里介绍串口通信&#xff0c;是因为在嵌入式中串口通信是与其他设备进行交互的一种重要方式&#xff…

Caffe 在自己的数据库上训练步骤

回忆ImageNet的步骤&#xff1a;http://caffe.berkeleyvision.org/gathered/examples/imagenet.html Brewing ImageNet This guide is meant to get you ready to train your own model on your own data. If you just want an ImageNet-trained network, then note that sinc…

1024程序员节来啦!!.NET技术圈独家优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50&#xff01;满200减100&#xff01;满300-150&#xff01;机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码&#xff0c;优惠码使用后相当于&#xff1a;400减230 …

你跟最伟大领导的距离,或许只差这一点

译者&#xff1a;宗天琪原文链接&#xff1a;https://www.linkedin.com/pulse/great-leaders-listeners-brigette-hyacinth/?fromgroupmessage&isappinstalled0倾听是领导者需要掌握的最重要的技能&#xff0c;它是很多其它领导才能的基石。然而&#xff0c;要做到精通这项…

Batch_size问题

有关solver.prototxt中的各项解释&#xff1a;http://www.cnblogs.com/denny402/p/5074049.html solver算是caffe的核心的核心&#xff0c;它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为 # caffe train --solver*_slover.prototxt 在…

程序员家的精品大闸蟹:青壳、白底、肉多、爆黄,现在是吃大闸蟹的最佳时期...

其实&#xff0c;我跟大家一样&#xff0c;也是dotNET跨平台和张队长的忠实粉丝&#xff0c;也是一名程序员。上上周&#xff0c;我在dotNET跨平台的优选商城买了队长推荐人生果&#xff0c;也是第一次吃这个人生果&#xff0c;味道鲜甜、汁水也特别多&#xff0c;但由于快递的…

C#刷遍Leetcode面试题系列连载(4): No.633 - 平方数之和

点击蓝字“dotNET匠人”关注我哟加个“星标★”&#xff0c;每日 7:15&#xff0c;好文必达&#xff01;前文传送门:上篇文章中一道数学问题 - 自除数&#xff0c;今天我们接着分析 LeetCode 中的另一道数学题吧~今天要给大家分析的面试题是 LeetCode 上第 633 号问题&#xff…

程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

菜菜哥&#xff0c;告诉你一个消息你有男票啦&#xff1f;非也非也&#xff0c;我昨天出去偷偷面试&#xff0c;结果又挂了哦&#xff0c;看来公司是真的不想让你走呀面试官让我说一下乐观锁和悲观锁&#xff0c;我没回答上来&#xff0c;回来之后我查了&#xff0c;数据库没有…

solverstate的使用

http://blog.csdn.net/wang4959520/article/details/51831637 我们在使用caffe训练过程中会生成.caffemodel和.solverstate文件&#xff0c;一个是模型文件&#xff0c;一个是中间状态文件&#xff08;生成多少个取决于你自己设定的snapshot&#xff09;。当训练过程中断&#…

IT从业者的迷思与求解之道——座谈会实录摘选

本次座谈会于上周六开始&#xff0c;由于网络原因&#xff0c;很多国内的小伙伴们没有能够连进去&#xff0c;挺遗憾的。所以我整理了本次座谈会的部分内容&#xff0c;希望能对大家有所帮助。洞察力主持人&#xff1a;大家好我们来自开源社群&#xff0c;今天举行在线it社区的…

准确率、召回率、F1、mAP、ROC、AUC

https://yongyuan-workbench.rhcloud.com/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2ir%E7%9A%84%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87%E4%BB%8B%E7%BB%8D-%E5%87%86%E7%A1%AE%E7%8E%87%E3%80%81%E5%8F%AC%E5%9B%9E%E7%8E%87%E3%80%81f1%E3%80%81map%E3%80%81r/准确率、召回率、F1…

从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用。 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11717254.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins前景回顾•••••简介在前…

小波变换基础

http://blog.csdn.net/GarfieldEr007/article/details/50151845 第十二章 小波变换 目录 1 引言 2 连续小波变换 3 二进小波变换 3.1 Haar变换 4 离散小波变换 4.1 多分辨率分析 4.2 快速小波变换算法 4.3 离散小波变换的…

.Net Core3.0使用gRPC

gRPC是什么gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务&#xff0c;以实现负载平衡&#xff0c;跟踪&#xff0c;运行状况检查和身份验证。它也适用于分布式计算的最后一英里&#xff0c;以将设备&am…

单链表逆向

转自&#xff1a;http://blog.csdn.net/heyabo/article/details/7610732 对于单链表的逆置有两种方法可以实现&#xff1a; &#xff08;1&#xff09;利用辅助指针 基本思想&#xff1a;在遍历结点过程中&#xff0c;设置辅助指针&#xff0c;用于记录先前遍历的结点。这样依次…

中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名

2019.11.9 的中国.NET开发者峰会将在上海举办&#xff0c;到目前为止&#xff0c;大会的主题基本确定&#xff0c;这两天就会和大家会面&#xff0c;很多社区的同学基于对社区的信任在我们议题没有确定的情况下已经购票超过了300张&#xff0c;而且分享的主题都来自于社区&…

高斯混合模型学习

转自&#xff1a;http://blog.csdn.net/jojozhangju/article/details/19182013 1.高斯混合模型概述 高斯密度函数估计是一种参数化模型。高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;是单一高斯概率密度函数的延伸&#xff0c;GMM能够平滑地近似任意形状的…

[工具]OFFICE插件管理工具-帮助更好地管理及使用电脑安装过的OFFICE插件

在OFFICE软件的世界中&#xff0c;除了由微软提供的OFFICE软件功能外&#xff0c;还有大量的功能由第三方开发者完成&#xff0c;市面上也存在大量的OFFICE插件供用户选择。使用场景有些插件仅在某个特定场景下才会使用&#xff0c;日常办公过程中&#xff0c;无需开启&#xf…

随机梯度下降的实现细节

http://www.miaoerduo.com/deep-learning/%E5%9F%BA%E4%BA%8Ecaffe%E7%9A%84deepid2%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%B8%8A%EF%BC%89.html 最近看了一篇文章&#xff0c;详细说明了随机梯度下降中随机是在create_imagenet.sh中shuffle实现的。 相关资源&#xff1a; DeepID&am…