当前位置: 首页 > news >正文

算法笔记_041:寻找和为定值的多个数(Java)

目录

1 问题描述

2 解决方案

 


1 问题描述

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

 


2 解决方案

上述问题是典型的背包问题的应用,即先找出n个数的所有组合,再在这些组合中寻找组合数相加之和等于sum的组合,并依次输出这些组合中的数。

具体代码如下:

package com.liuzhen.array_2;

public class ManySumN {
    /*
     * 函数功能:以字符串形式返回1~n个数的所有子集,其中0代表不包含其中数字i,1代表 包含其中数字i
     * 此段代码是运用反射格雷码的思想,具体解释详见:算法笔记_019:背包问题(Java)
*/
    public String[] getAllGroup(int n){
        int len = (int) Math.pow(2, n);
        String[] result = new String[len];
        if(n == 1){
            result[0] = "0";
            result[1] = "1";
            return result;
        }
        String[] temp = getAllGroup(n-1);
        for(int i = 0;i < temp.length;i++){
            result[i] = "0" + temp[i];
            result[len-1-i] = "1" + temp[i];
        }
        return result;
    }
    /*
     * 参数n:代表有1~n的n个不同整数
     * 函数功能:打印出1~n中所有随机组合的几个数,其相加的和等于sum
     */
    public void printManySumN(int n,int sum){
        System.out.println("1~"+n+"个数中,相加之和等于"+sum+"的所有组合数为:");
        String[] allGroup = getAllGroup(n);
        for(int i = 0;i < allGroup.length;i++){
            char[] temp = allGroup[i].toCharArray();
            int tempSum = 0;
            for(int j = 0;j < temp.length;j++){
                if(temp[j] == '1')
                    tempSum += (j+1);
            }
            if(tempSum == sum){
                for(int j = 0;j < temp.length;j++){
                    if(temp[j] == '1')
                        System.out.print((j+1)+" ");
                }
                System.out.println();
            }
        }
    }
    
    public static void main(String[] args){
        ManySumN test = new ManySumN();
        test.printManySumN(10, 16);
    }
}

运行结果:

1~10个数中,相加之和等于16的所有组合数为:
7 9 
6 10 
4 5 7 
3 4 9 
3 5 8 
3 6 7 
2 3 5 6 
2 3 4 7 
2 4 10 
2 5 9 
2 6 8 
1 2 6 7 
1 2 5 8 
1 2 4 9 
1 2 3 4 6 
1 2 3 10 
1 3 5 7 
1 3 4 8 
1 4 5 6 
1 5 10 
1 6 9 
1 7 8 

 

 

相关文章:

  • 用外部表的方式查询当天数据库alert日志文件
  • css 如何让背景图片拉伸填充避免重复显示
  • github常用操作
  • Codeforces 768C:Jon Snow and his Favourite Number
  • test
  • 微软职位内部推荐-Software Engineer II
  • 全局变量的声明
  • LINUX第五课
  • Linux基础学习三
  • Elasticsearch开发环境搭建(Eclipse\MyEclipse + Maven)
  • JVM再了解了解
  • 单测中会用到的类,锁+定时器,等待回调的值返回
  • 进制转换
  • mac 远程桌面提示: 证书或相关链无效
  • [Thinking in JAVA] 关于内部类的一些知识点
  • Android 架构优化~MVP 架构改造
  • docker python 配置
  • JS+CSS实现数字滚动
  • leetcode388. Longest Absolute File Path
  • 汉诺塔算法
  • 缓存与缓冲
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端性能优化——回流与重绘
  • 人脸识别最新开发经验demo
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 一道闭包题引发的思考
  • 用Python写一份独特的元宵节祝福
  • 怎么将电脑中的声音录制成WAV格式
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #14vue3生成表单并跳转到外部地址的方式
  • (007)XHTML文档之标题——h1~h6
  • (4)(4.6) Triducer
  • (pytorch进阶之路)扩散概率模型
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (solr系列:一)使用tomcat部署solr服务
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (篇九)MySQL常用内置函数
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)(官方)UE4--图像编程----着色器开发
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net MVC + EF搭建学生管理系统
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net中调用windows performance记录性能信息
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [ActionScript][AS3]小小笔记
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C#C++]类CLASS
  • [ffmpeg] 定制滤波器