算法问题

漾漾扬 2016-10-18 06:55:00
设计一个算法,输入一个整数,输出是人民币(100,50,20,10,5,2,1)的全排列,即这个金额有多少种排列组合。(今天遇到的一道面试题)
...全文
642 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
nikyotensai 2016-10-25
  • 打赏
  • 举报
回复
引用 17 楼 bree06 的回复:
谁有2元的RMB给我开开眼
bree06 2016-10-25
  • 打赏
  • 举报
回复
谁有2元的RMB给我开开眼
hehamfll 2016-10-23
  • 打赏
  • 举报
回复
看起来好像不难,实际还是要花点功夫的,比如10块可以是一个10,2个5,5个2,10个1
qq_15654157 2016-10-19
  • 打赏
  • 举报
回复
7重for循环 。是牛逼还是傻逼啊? 就算得出了正确结果,面试官还是会给你0分,
ITjavaman 2016-10-19
  • 打赏
  • 举报
回复
首先从你的题意里面,问题只是问多少种情况而不是要你用程序实现,所以用排列公式是可以算出来的 7*6*5*4*3*2*1=5040 下面我也用代码实现了下
public class Main {

	public static void main(String[] args) {
		String[] moneynum = { "100", "50", "20", "10", "5", "2", "1" };
		String[] result = new String[moneynum.length];
		Main.pailie(moneynum, result, 0);

	}

	private static String[] pailie(String[] moneynum, String[] result, int length) {

		if (moneynum.length != 0) {
			List<String> list = new ArrayList<String>();
			for (int i = 0; i < moneynum.length; i++) {
				list.clear();
				list = Main.add(moneynum);
				result[length] = moneynum[i];
				list.remove(moneynum[i]);
				String[] arr = list.toArray(new String[moneynum.length - 1]);
				Main.pailie(arr, result, length + 1);
			}
		} else {
			Main.print(result);
		}
		return null;
	}

	private static List add(String [] s){
		List<String> list = new ArrayList<String>();
		for(String a : s){
			list.add(a);
		}
		return list;
	}

	private static void print(String[] result) {
		for (int i = 0; i < result.length; i++) {
			System.out.print(result[i] + ", ");
		}
		System.out.println();
	}
}
Be_nurturing 2016-10-19
  • 打赏
  • 举报
回复
面试官估计不想见到这种答案
家里敷泥呀 2016-10-19
  • 打赏
  • 举报
回复
引用 3 楼 u013595256 的回复:
这么多for循环,被吓到了,你牛。
  • 打赏
  • 举报
回复
用递归法思想,假设输入的整数为n,首先确定100对应的合法系数k(从0到[n/100]的非负整数),然后针对(n-100*k)计算出(50,20,10,5,2,1)的全排列,以此类推,直到递归出口(1)的全排列。代码就省了,个人觉得思想最重要。
  • 打赏
  • 举报
回复
引用 13 楼 ITjavaman 的回复:
[quote=引用 11 楼 qq_26946497 的回复:] 不是求A77,而是给定一个int,将这个int按照若干个给定的int值去余,看看能有几种余法……
这就是求A77吧[/quote]设计一个算法,输入一个整数,输出是人民币(100,50,20,10,5,2,1)的全排列,即这个金额有多少种排列组合。
ITjavaman 2016-10-19
  • 打赏
  • 举报
回复
引用 11 楼 qq_26946497 的回复:
不是求A77,而是给定一个int,将这个int按照若干个给定的int值去余,看看能有几种余法……
这就是求A77吧
  • 打赏
  • 举报
回复
分析: 人民币面额有(100,50,20,10,5,2,1) 排列是不必要的,只要求组合数量就可以了(排列与组合的倍数关系可以用数学公式得出) 对这道题来说,组合方式其实就是一个函数: y = 100x1 + 50x2 + 20x3 + 10x4 + 5x5 + 2x6 + x7 +0; 其中y就是给定的money值,而每一种确定的x1~x7就是一种组合方式。 由于x只能是整数,所以这是一个……线性规划问题……? 妈呀,到高数了,我先退散,坐等高数达人解答……
  • 打赏
  • 举报
回复
不是求A77,而是给定一个int,将这个int按照若干个给定的int值去余,看看能有几种余法……
  • 打赏
  • 举报
回复
我看了半天……才明白……
rickylin86 2016-10-19
  • 打赏
  • 举报
回复

public class Test{
	public static void main(String[] args){
		String[] strs = {"a","b","c","d"};
		sort(strs);
	}

	private static void sort(String[] strs){
		sort(strs,0);
	}

	private static void sort(String[] strs,int index){
		if(index == strs.length){
			for(String str : strs){
				System.out.printf("%s ",str);
			}
			System.out.println();
			return;
		}

		String temp = null;
		for(int i = index ; i < strs.length ; i ++){
			temp = strs[i];
			strs[i] = strs[index];
			strs[index] = temp;
			sort(strs,index + 1);
			temp = strs[i];
			strs[i] = strs[index];
			strs[index] = temp;
		}
	}
}
  • 打赏
  • 举报
回复
同意楼上次说法!!!
rendason 2016-10-18
  • 打赏
  • 举报
回复
说实话,我尝试了几种常用的算法,如动态规划、贪心算法,但并没有找到合适的解决这个问题的算法。最终写了一个遍历算法作为解决方案的落地,同时渴望楼下的牛人给出更加科学的解法。下面是遍历算法

public class Solution {
    public static void main(String[] args) {
    	Scanner scan = new Scanner(System.in);
    	int n = scan.nextInt();
    	scan.close();
    	List<String> result = new ArrayList<>();
    	int max100 = n / 100;
    	for (int i100 = 0; i100 <= max100; i100++) {
    		int max50 = (n - i100 * 100) / 50;
    		for (int i50 = 0; i50 <= max50; i50++) {
    			int max20 = (n - i100 * 100 - i50 * 50) / 20;
    			for (int i20 = 0; i20 <= max20; i20++) {
    				int max10 = (n - i100 * 100 - i50 * 50 - i20 * 20) / 10;
    				for (int i10 = 0; i10 <= max10; i10++) {
    					int max5 = (n - i100 * 100 - i50 * 50 - i20 * 20 - i10 * 10) / 5;
    					for (int i5 = 0; i5 <= max5; i5++) {
    						int max2 = (n - i100 * 100 - i50 * 50 - i20 * 20 - i10 * 10 - i5* 5) / 2;
    						for (int i2 = 0; i2 <= max2; i2++) {
    							int max1 = n - i100 * 100 - i50 * 50 - i20 * 20 - i10 * 10 - i5* 5 - i2* 2;
    							for (int i1 = 0; i1 <= max1; i1++) {
    								if (100 * i100
    										+ 50 * i50
    										+ 20 * i20
    										+ 10 * i10
    										+ 5 * i5
    										+ 2 * i2
    										+ 1 * i1 == n) {
    									String str = String.format("100 * %d "
    											+ "+ 50 * %d + 20 * %d + 10 * %d "
    											+ "+ 5 * %d + 2 * %d + 1 * %d", 
    											i100, i50, i20, i10, i5, i2, i1);
    									result.add(str);
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	System.out.println("count:");
    	System.out.println(result.size());
    	System.out.println("combination:");
    	Iterator<String> iter = result.iterator();
    	while (iter.hasNext()) {
    		System.out.println(iter.next());
    	}
	}
}
漾漾扬 2016-10-18
  • 打赏
  • 举报
回复
引用 1楼肃穆丶 的回复:
mark
什么意思啊
肃穆丶 2016-10-18
  • 打赏
  • 举报
回复
mark

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧