Java实现寻找和为定值的多个数
1 问题描述
输入两个整数n和sum,要求从数列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的所有组合数为:
9
10
5 7
4 9
5 8
6 7
3 5 6
3 4 7
4 10
5 9
6 8
2 6 7
2 5 8
2 4 9
2 3 4 6
2 3 10
3 5 7
3 4 8
4 5 6
5 10
6 9
7 8
Java实现寻找和为定值的多个数的更多相关文章
- 在数组中寻找和为定值的n个数
/*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...
- 算法笔记_041:寻找和为定值的多个数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...
- 算法笔记_037:寻找和为定值的两个数(Java)
目录 1 问题描述 2 解决方案 2.1 排序夹逼法 1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即 ...
- 编程之法section II: 2.2 和为定值的两个数
====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...
- 和为定值的m个数
和为定值的m个数 np 问题(时间复杂度o(2**n)) code1: 暴力递归 解决 只有正数的情况 class Solution { private List<List<Integer ...
- 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数
在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...
- 编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示
编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示 效果如下: 实现代码: import java.util.Arrays; import java.util.Scanne ...
- java 从数据删除指定值
public class ArrayRemoveValue { public static void main(String[] args) { Integer[] _IntArray = new I ...
- python寻找小于给定值的最大质数
# -*- utf-8 -*- # @Time: 2019-04-16 # @ Author: chen def prime(self, value): """判断是否为 ...
随机推荐
- 内容安全策略(CSP)详解
1.背景 1.1.同源策略 网站的安全模式源于"同源策略",web浏览器允许第一个web页面中的脚本访问页面中的数据,但前提是两个web页面具有相同的源.此策略防止一个页面的恶意脚 ...
- WordPress安装:零基础入门教程
WordPress安装:零基础入门教程 1主机空间要求要运行 WordPress,主机空间需满足以下条件.不过现在网络上的空间基本都可以,而且还让你随意定制Php和Mysql版本,至于空间和数据库大小 ...
- js canvas压缩图片和jQuery ajax上传图片简单demo
原来用的插件,里面东西太乱了,一会jq,一会原生js,本来原生js就不熟,看起来更难受,而且感觉好多东西都是没用的,而且后端php转存文件一直不是很熟悉,正好一起整理一下.就是很简单的一个demo,如 ...
- Java并发编程:线程池ThreadPoolExecutor
多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...
- ssh别名登录,非常适合从跳板机登录其他主机
一般连主机会是这样的: ssh admin@IP 端口变了的话还要加上端口号 ssh admin@IP -p 10022 可以用ssh别名简化这个操作: vim .ssh/config 想要全局生效的 ...
- react项目中使用less并修改antd主题样式
一.react项目中使用less 1. 安装配置 npm i -D less less-loader 2. 查看webpack配置 npm run eject 此操作不可逆,生成新的目录. 3. 修改 ...
- java中字符串截取
1.使用StringUtils,需要导包 String strs = "abcdef1003535197"; System.out.println("=====2==== ...
- pyhton中的深浅copy
深浅拷贝:数据分离情况 1. =赋值:数据完全共享(指向内存中的同一个对象)被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址: (1)如果是不可变数据类型(数字.字符串等),修改其中的一 ...
- 10.02经典类的bug
#以下在python 3.6版本里已没有这个问题了1class A: def _init__(self): print ("this is A") def save(self): ...
- python之robotframework+ride测试框架
一.robotframework简介 Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式 ...