n个数字相加组合问题 & 荷兰旗问题

题目描述:  给定两个数字 m,n, 其中m和n满足关系 m>=n>0。请输出n个数字相加等于m(即i1+i2+i3+.......in = m) 的所有可能组合。

input     :  m=4  ,n=2

output  :  1,3     2,2


代码如下:

package 实际问题;

import java.util.Stack;

public class jiashu {

    /**
     * 输入两个整数 m,n  其中 m>=n>0,使 i1 + i2 +....in = m,请求出其所有结果
     * for example : m = 4 , n = 2 
     * output:   1,3   2,2
     */
    public static void main(String[] args) {
       
        new jiashu().get(8, 3, 1);
        System.out.println("-----------------------------------------------------");
        new jiashu().get2(8, 3, 1, "");
        
    }
    
    private Stack<Integer> stack = new Stack<Integer>(); 
    public void get(int m, int n, int max)
    {
        if(n==1 && m>=1)
        {
            if(!stack.isEmpty())
            {
                for(int i=0; i<stack.size(); i++)
                {
                    System.out.print(stack.get(i)+",");
                }
                    System.out.println(m);
                    stack.pop();          //将上一层压栈的数据弹出
            }
           return;
        }
        else
        {
            for(int i=max; i<=m/n; i++)
            {
                stack.add(new Integer(i));
                get(m-i, n-1, i);
            }
            if(!stack.isEmpty())
                  stack.pop();          //将上一层压栈的数据弹出
        }
    }
    
    
    public void get2(int m, int n, int max, String str)
    {
        if(n==1 && m>=1)
        {
              System.out.println(str+m);
        }
        else
        {
            for(int i=max; i<=m/n; i++)
            {
                get2(m-i, n-1, i, str+i+",");
            }
        }
    }

}
题目描述

现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。如下图所示:

    


/*
 * 荷兰旗问题:http://blog.csdn.net/v_july_v/article/details/18824517
 * */
public class Netherlands {
	
	public static void main(String args[])
	{
		Netherlands nls =new  Netherlands();
		int []res = {2, 1, 3, 1, 1, 2, 3, 3, 1};
		res = nls.partitionLands(res, res.length);
	}
   
	/* 使用分治的算法,参看算法:快速排序  */
	public int[] partitionLands(int []res, int len )
	{
		int begin=0, cur=0, end=len-1;
		while(cur<end)
		{
			if(res[cur] == 1){
				int temp = res[begin];
				res[begin] = res[cur];
				res[cur] = temp;
				cur++; begin++;
			}
			else if(res[cur] == 3){
				int temp = res[end];
				res[end] = res[cur];
				res[cur] = temp;
				end--;
			}
			else{   //res[cur] == 2
				cur++;
			}
		}
		return res;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值