/**
*
* @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++;
}
}
}
}
分享到:
相关推荐
用回溯法解决整数划分的问题,注意哦 是java描述 和C语言描述两个版本的哦
整数的分划问题 将正整数n表示成一系列正整数之和,n=n1+n2+...+nk,其中n1>n2>...>nk,k>=1。正整数n的不同划分个数称为n的划分数
递归回溯法求解整数线性规划及MATLAB实现.pdf
采用回溯法解决旅行商问题,获得最短路径回路。
回溯法解决数独问题-2.docx
使用回溯法解决n皇后问题,没有用到栈的结构(但实际算法类似于栈),代码比较简约漂亮
使用MATLAB语言实现递归回溯法求解整数线性规划问题
回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法回溯法
通过回溯法解决背包问题,分析与其他方法的比较
最近我写了一篇csdn文章:【算法设计与分析】——整数划分问题(回溯法),并且画了一个流程图,为了让大家更加清楚的理解我讲的内容,所以我给大家录了一个讲解视频,希望大家一起进步哦~
算法设计作业,用c++编写的,回溯法求解n皇后问题 运行环境VC6.0
主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友可以参考下
这是用C++语言写的一个关于图着色的问题。对于初学算法的人有帮助。
01背包问题是一个很经典的问题,在这里我用回溯法解决。希望大家一起来探讨呀!
用回溯法解决全排列问题:计算从1到N的N个整数所能构成的所有排列,并按照字典顺序依次输出。
算法分析与设计回溯法完整实验报告(包含java代码)
利用回溯法解决8皇后问题,简单并且和很好理解!
利用回溯法解决01背包问题,自己写的一个代码。 输入:其第1行上有2个整数n和c,分别是物品个数n和背包所能容纳物品的重量,(n,c),第2行上有n个整数v1、v2、…、vn,依次是n个物品的价值,第3行上有n个整数w1、w2...
利用回溯法解决01背包问题,在限定背包重量时获得最大价值。 注:物品按单位价值降序排列