`

5元10元找钱问题

 
阅读更多

问题:有10个人去买票,票价5元,其中5个人有5元的钱,另外5个只有10元的钱。售票员没有5元的钱,每个人只买一张票,为使售票员的5元钱够用,这10个人有多少种排法?

 

分析:用‘1’表示有5元的人,‘0’表示有10元的人。问题实际上是求由5个0和5个1排列的字符串,从1开始到长度为k(k<=10)的子串中任何时候1出现的次数要比0出现的多。比如:排列1111100000是符合要求的。

我的实现方式:

 

public class PermutationForChange {

	/**
	 * @author:lilywangcn
	 * @date:2010-12-14
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String arr_Str="01";
		StringBuilder sb=new StringBuilder();
		permutationForChange(0,arr_Str,sb,10,0,0);
	}
	
	//num1:当前字符串中字符1的个数
	//num0:当前字符串中字符0的个数
	//n:字符串总长度
	//sb:已经排好的字符串
	//index:已排好的字符串长度
	public static void permutationForChange(int index, String arr_Str,StringBuilder sb,int n,int num1, int num0){
		if(index==n){
			System.out.println(sb);
		}else{
			StringBuilder tmp=new StringBuilder(sb);
			char ch;
			if(num1<=num0 && num1<n/2){
				ch='1';
				num1++;
				tmp.insert(index, ch);
				permutationForChange(index+1,arr_Str,tmp,n,num1,num0);
			}else if(num1>=n/2){
				ch='0';
				num0++;
				tmp.insert(index, ch);
				permutationForChange(index+1,arr_Str,tmp,n,num1,num0);
			}else{
				for(int i=0;i<arr_Str.length();i++){
					ch=arr_Str.charAt(i);
					if(ch=='0') num0++;
					else num1++;
					tmp.insert(index, ch);
					permutationForChange(index+1,arr_Str,tmp,n,num1,num0);
					if(tmp.charAt(index)=='0') num0--;
					else num1--;
					tmp=new StringBuilder(sb);
				}
			}
		}
	}

}

  

结果:有42种方式

  

1010101010
1010101100
1010110010
1010110100
1010111000
1011001010
1011001100
1011010010
1011010100
1011011000
1011100010
1011100100
1011101000
1011110000
1100101010
1100101100
1100110010
1100110100
1100111000
1101001010
1101001100
1101010010
1101010100
1101011000
1101100010
1101100100
1101101000
1101110000
1110001010
1110001100
1110010010
1110010100
1110011000
1110100010
1110100100
1110101000
1110110000
1111000010
1111000100
1111001000
1111010000
1111100000

 

 

 

 

分享到:
评论

相关推荐

    软件测试技术实验报告.doc

    假定此商店的货币面值只包括:50元(M50)、10元(M10)、 5元(M5)、1元(M1) 四种。 1.2白盒测试问题描述 10个铅球中有一个假球(比其他铅球的重量要轻),用天平三次称出假球。 第一次使用天平分别称5个球,判断轻的...

    钱币组合问题/动态规划/C语言

    问题描述:设有 n 种不同的钱币各若干张,可用这 n 种钱币产生许多不同的面值。试 设计一个算法,计算给定的某个面值,能有多少种不同的产生方法。例如有 1 分3 张,2 分 3 张,5 分 1 张,则能组成 7 分面值的...

    用贪心算法实现购物找零(支付+找零使用最少硬币数)

    硬币找钱问题 问题描述 设有6种不同面值的硬币,各硬币的面值分别为5分,1角,2角,5角,1元,2元。现要用这些面值的硬币来购物和找钱。购物时规定了可以使用的各种面值的硬币个数。 假定商店里各面值的硬币有...

    设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。

    设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。...对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。

    4.zip_PLC程序_售卖机_售货机 plc_售货机plc_自动售卖机

    (1) 此自动售货机可投入1元硬币、5元纸币、10元纸币。 (2) 此自动售货机可销售两种饮品:果汁(12元)和啤酒(15元)。 (3) 当投入的币值等于或超过12元时,果汁指示灯亮;当投入的币值等于或超过15元时,果汁...

    Q1059365.zip 问题的回答,C++ 至少准备多少张RMB才能恰好支付n元

    小C不喜欢带钱,有一次竟被他碰上了一家不能使用移动支付(也不能找钱)的神秘商店。请问小C至少准备多少张RMB才能恰好支付...RMB的面额有100元,50元,20元,10元,5元,1元。 https://ask.csdn.net/questions/1059365

    最少硬币问题

    对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。 数据输入: 第一行中只有1 个整数给出n的值,第2 行起每行2 个数,分别是T[j]和...

    算法设计与分析-最少硬币问题

    对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。 Input 每组测试数据的第一行中只有1 个整数n, 第2 行起每行2 个数,分别是T[j...

    zi-dong-shou-yin-liao-ji-.rar_纸币机

    自动售出饮料机系统。...系统可接受五种钱币类型,分别为硬币5角、硬币1元、纸币1元、纸币5元和纸币10元;基本要求:第一,每次可以购置一瓶饮料;第二,每次购置饮料可以接受多次钱币的投入;第三,可以找钱;

    Python实现的一个找零钱的小程序代码分享

    Python写的一个按面值找零钱的程序,按照我们正常的思维逻辑从大面值到小面值的找零方法,人民币面值有100元,50元,20元,10元,5元,1元,5角,1角,而程序也相应的设置了这些面值。只需要调用函数时传入您想要...

    JS使用贪心算法解决找零问题示例

    比如,需要找钱数为25时,找钱方式为20+5,而不是10+10+5。 贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。 可惜的是,它需要证明后才能真正运用到题目的算法中。 [removed] var ...

    实现货币换算的C程序

    有5、10、25三种硬币,实现自动售货机的找钱机制

    电子商务分析与设计.doc

    电子商务分析与设计全文共13页,当前为第10页。 电子商务分析与设计全文共13页,当前为第11页。 电子商务分析与设计全文共13页,当前为第12页。 电子商务分析与设计全文共13页,当前为第13页。

Global site tag (gtag.js) - Google Analytics