第一讲、整数划分(回溯实现)
来源:互联网 发布:宾馆软件破解版 编辑:程序博客网 时间:2024/06/06 01:17
/**
*
* @author chenzhuzuo
* 回溯法解决数字拆分问题
* 问题描述:
* 整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1, 2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
*
*
*以前做这个题时一直找不到好的思路,在网上也看了一下别人的做法,更多的是使用递归的算法,
*看了还是不太明白,这几天研究了一下回溯算法,做了几个比较经典的题目,感觉本题可以用求
*子集和的思路来解决,就试了一下,最后还是做出来了,不过效率不是很高。经过今天的学习
*,感觉回溯法确实很难懂,但是一旦你弄懂了,回溯法可以说是万能的,真的很好用
*/
public class ShuziChaiFei {
/**
* @param args
*/
public static void main(String[] args) {
printResult(6);
}
/**
*
* @param n对n进行拆分
*/
private static void printResult(int n){
int a[]= new int[n+1];//用于记录每个数出现的个数(1=<i<=n);
for(int i=0;i<=n;i++){
a[i]=0;
}
int sum=0;
int k = 1;
while(k>=1){
a[k] += 1;
sum+=k;
if(sum==n){//如果当前的和等于n则获得一个解,输出
for(int i=1;i<=k;i++){
int m=1;
//a[i]等值表示i在这个解中出现的次数
while(m<=a[i]){
if(m==a[i]&&i==k){
System.out.print(i);
m++;
}
else{
System.out.print(i+"+");
m++;
}
}
}
a[k]++;//继续搜索解空间
sum+=k;
System.out.println();
}
else if(sum>n){
sum -= k;
a[k] -=1;
k++;
}
//当k>n时进行回溯
if(k>n){
k--;
while(a[k]>0){
sum=sum-a[k]*k;
k--;
}
while(a[k]==0){
k--;
if(k<1){
return;
}
}
sum -= k;
a[k]--;
k++;
}
}
}
}
*
* @author chenzhuzuo
* 回溯法解决数字拆分问题
* 问题描述:
* 整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1, 2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
*
*
*以前做这个题时一直找不到好的思路,在网上也看了一下别人的做法,更多的是使用递归的算法,
*看了还是不太明白,这几天研究了一下回溯算法,做了几个比较经典的题目,感觉本题可以用求
*子集和的思路来解决,就试了一下,最后还是做出来了,不过效率不是很高。经过今天的学习
*,感觉回溯法确实很难懂,但是一旦你弄懂了,回溯法可以说是万能的,真的很好用
*/
public class ShuziChaiFei {
/**
* @param args
*/
public static void main(String[] args) {
printResult(6);
}
/**
*
* @param n对n进行拆分
*/
private static void printResult(int n){
int a[]= new int[n+1];//用于记录每个数出现的个数(1=<i<=n);
for(int i=0;i<=n;i++){
a[i]=0;
}
int sum=0;
int k = 1;
while(k>=1){
a[k] += 1;
sum+=k;
if(sum==n){//如果当前的和等于n则获得一个解,输出
for(int i=1;i<=k;i++){
int m=1;
//a[i]等值表示i在这个解中出现的次数
while(m<=a[i]){
if(m==a[i]&&i==k){
System.out.print(i);
m++;
}
else{
System.out.print(i+"+");
m++;
}
}
}
a[k]++;//继续搜索解空间
sum+=k;
System.out.println();
}
else if(sum>n){
sum -= k;
a[k] -=1;
k++;
}
//当k>n时进行回溯
if(k>n){
k--;
while(a[k]>0){
sum=sum-a[k]*k;
k--;
}
while(a[k]==0){
k--;
if(k<1){
return;
}
}
sum -= k;
a[k]--;
k++;
}
}
}
}
0 0
- 第一讲、整数划分(回溯实现)
- 第一讲,整数划分 JAVA 代码(分治实现之一)
- 第一讲、整数划分(分治实现之二)
- 回溯法解答整数划分问题(Java版本)
- 算法实现(4)整数划分问题
- 整数划分(C语言实现)
- 递归实现整数划分
- 整数划分问题java实现
- 整数划分(递归)
- 整数划分(二)
- 整数划分(2)
- 整数划分(三)
- 整数划分(四)
- 整数划分(递归)
- 整数划分(四)
- 整数划分(二)
- 整数划分(四)
- 整数划分(四)
- Codefroces 618D Hamiltonian Spanning Tree 树型动规
- TCP显示冲突通告(ECN)
- 集训队专题(2)1007 Evolution
- 【NYOJ】[463]九九乘法表
- JFinal+WebUploader实现图片的异步上传
- 第一讲、整数划分(回溯实现)
- 【JS】【笔记】JavaScript入门经典(第5版)第1章 概述
- [c++]TRACE 宏的利用
- 求一份 电力猫 QCA6410 原理图等
- 第一讲、整数划分(分治实现之二)
- 【JS】【笔记】JavaScript入门经典(第5版)第2章 简单的脚本
- 添加pch全局引用文件
- C++及模式设计系列
- 【JS】【笔记】JavaScript入门经典(第5版)第3章 函数