标签:
描述 |
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入 每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。<=n<=10<=m<=10
样例输入 7 3
样例输出 8
/** * 计算放苹果方法数目
* 1 <= m,n <= 10<><= m,n <= 10<> * @param m 苹果数目 * @param n 盘子数目数 * @return 放置方法总数 * */ public static int count(int m, int n)
|
---|---|
知识点 | 循环 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 |
输入两个int整数 |
输出 |
输出结果,int型 |
样例输入 | 7 3 |
样例输出 | 8 |
package com.oj5; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Oj { static int count; private static void find(int[] flag,int pos,int appleNum,int plateNum,List list){ //System.out.println(appleNum+" "+plateNum+" "+pos); if(pos==appleNum){ int[] plates = new int[plateNum+1]; for(int i = 0;i < appleNum; i++) plates[flag[i]]++; for(int i = 1; i<= plateNum-1; i++) for(int j = 1;j <= plateNum-i; j++) if(plates[j]<plates[j+1]){ int temp = plates[j]; plates[j] = plates[j+1]; plates[j+1] = temp; } boolean isExist = false; for(int i = 0;i < list.size(); i++){ int[] arr = (int[]) list.get(i); int j = 1; for(;j <= plateNum; j++) if(plates[j]!=arr[j]) break; if(j==plateNum+1){ isExist = true; break; } } if(!isExist) list.add(plates); return; } for(int i = 1;i <= plateNum; i++){ flag[pos] = i; find(flag,pos+1,appleNum,plateNum,list); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int appleNum = in.nextInt(); int plateNum = in.nextInt(); int[] flag = new int[appleNum]; List<Integer[]> list = new ArrayList<Integer[]>(); find(flag,0,appleNum,plateNum,list); System.out.println(list.size()); } }
标签:
原文地址:http://www.cnblogs.com/lxk2010012997/p/5396953.html