问题:有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
分享到:
相关推荐
在C#.NET中实现贪心算法找钱问题,首先我们需要定义硬币的面额集合,这通常包括常见的货币单位,如1分、5分、10分、20分、50分以及元等。然后,我们需要定义找零金额,这是用户需要找回的总钱数。 算法的基本步骤...
首先,我们要明确问题的定义:假设我们有一组不同面值的硬币,如1元、5元、10元等,目标是找出找零给定金额所需的最少硬币数量。例如,如果总金额是19元,而我们有1元、5元和10元的硬币,我们可能会选择用1个10元、1...
- **硬币面值**:[1, 5, 10, 25] - **目标金额**:67 按照上述算法,我们可以依次选择: - 2 枚 25 分硬币 (50 分) - 1 枚 10 分硬币 (60 分) - 1 枚 5 分硬币 (65 分) - 2 枚 1 分硬币 (67 分) 最终结果为 5 枚...
在C#编程中,贪心算法可以被应用于解决多种问题,如找钱问题就是其中一个经典实例。在这个问题中,我们需要用最少的硬币找零,给定不同面值的硬币和一个总金额,贪心算法会选择最大面值的硬币优先,以期望减少硬币的...
硬币找钱问题,也被称为零钱兑换问题,是一个经典的计算机科学中的算法设计问题。它主要探讨如何使用最少数量的硬币来凑成一个给定的金额,通常假设我们有不同面额的硬币可供选择。这个问题在实际生活中非常常见,...
这个问题通常描述为:给定不同面额的硬币,如1元、5元、10元等,目标是用最少的硬币数量凑出指定的总金额。我们可以从以下几个方面详细探讨这个问题: 1. **问题定义**:硬币问题的核心在于寻找最小硬币组合来达成...
硬币找钱问题 问题描述 设有6种不同面值的硬币,各硬币的面值分别为5分,1角,2角,5角,1元,2元。现要用这些面值的硬币来购物和找钱。购物时规定了可以使用的各种面值的硬币个数。 假定商店里各面值的硬币有...
题目中提到的6种硬币分别为5分、1角、2角、5角、1元和2元。通过合理的算法设计,找到一种最优的找零方案,使得所用硬币的数量最少。 ### 二、贪心算法概述 贪心算法是一种在每个步骤中都采取当前状态下最好或最优...
在找零钱的算法中,程序首先检查商品价格和付款是否在0到100元的范围内,接着根据货币面值(50元、10元、5元、1元)计算找零的数量。这里运用了模运算和除法,确保找零的计算准确无误。例如,n50是通过(P - R)除以50...
设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。...对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。
- 明明带5元买3元的商品,售货员没找钱,可能是明明只给了3元。 - 付钱最简便的方式通常是直接使用最大面额的纸币,例如5元7角可以付5元加2张2角。 4. **看图填空**: - 图中的金额需要根据面额填写。 - 要求...
2. **不同面额的人民币**:人民币的面额种类较多,本试卷主要涉及的是1角、5角、1元、2元、5元、10元、20元、50元以及100元。 3. **货币兑换**:掌握不同面额人民币之间的兑换关系,例如,如何通过较小面额的人民币...
### 钱币组合方法数的问题(C++实现) #### 问题背景与描述 本问题主要探讨了在给定多种不同面额的钱币及其数量的情况下,如何计算出组成某一特定金额的不同组合方式的数量。该问题属于典型的组合计数问题,在实际...
7. 思考题:最后一部分的思考题如“李叔叔去商店买牛奶用了30元,买面包用了6元,他有10元、5元、1元的人民币各5张,如果不找钱,该怎样付钱?”这样的问题既考验了学生对于人民币支付方式的理解,也培养了学生的...
(1) 此自动售货机可投入1元硬币、5元纸币、10元纸币。 (2) 此自动售货机可销售两种饮品:果汁(12元)和啤酒(15元)。 (3) 当投入的币值等于或超过12元时,果汁指示灯亮;当投入的币值等于或超过15元时,果汁...
元是最大的单位,包括1元、2元、5元、10元、20元、50元以及100元的纸币。角是次一级的单位,有1角、2角和5角的硬币。分是最小的单位,包含1分、2分和5分的硬币。纸币和硬币的区分也是人民币认知的一部分,帮助孩子们...
在学习小面值的人民币后,教材继续教学大面值的人民币,包括2元、5元、10元、20元、50元、100元等。这些大面值的人民币可以帮助学生更好地理解人民币的价值和使用。 知识点4:实践活动 教材安排了许多实践活动,...
小C不喜欢带钱,有一次竟被他碰上了一家不能使用移动支付(也不能找钱)的神秘商店。请问小C至少准备多少张RMB才能恰好支付...RMB的面额有100元,50元,20元,10元,5元,1元。 https://ask.csdn.net/questions/1059365
纸币通常用于大额交易,包括1元、2元、5元、10元、20元、50元和100元等面值。硬币则常用于小额交易,有1元、5角和1角的面值,此外还有更小的1分和2分硬币,尽管在现代生活中,1分和2分硬币的使用已相对较少。 ...
同样,减法如2角-5分等于1角5分,10元2角-5角等于10元1角,这些都是基本的货币换算。 其次,教学的重难点是将所学应用到实际生活场景中。例如,让学生判断商品价格的合理性,比如西瓜大约价值32元,衣服的价格在75...