分月饼
标题:分月饼 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
题目描述:
中秋节,公司分月饼,m个员工,买了n个月饼,m<=n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2 <= 3,单人分到第n-1多月饼个数是Max(n-1),单人分到第n多月饼个数是Max(n),Max(n-1) – Max(n) <= 3, 问有多少种分月饼的方法?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int m = input.nextInt();
int n = input.nextInt();
int nm = n - m;
int total = 0;
if(m > n){
System.out.println(0);
return;
}
for (int i = 0; i < nm; i++){
total = total + mooncake(m - 1, nm - i, i);
}
System.out.println(total);
}
public static int mooncake(int m, int nm, int k){
if (nm <= 0){
return 0;
}
if (m <= 0){
return 0;
}
if (m == 1){
if(nm >= k && nm <= k + 3){
return 1;
}
return 0;
}
int total = 0;
for (int i = k; i <= k + 3; i++){
total = total + mooncake(m - 1, nm - i, i);
}
return total;
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int person = scanner.nextInt();
int num = scanner.nextInt();
System.out.println(getNum(person, num));
}
}
private static int getNum(int person, int num) {
int result = 0;
if (person == num) {
result = 1;
} else {
for (int i = 1; i < num - person + 2; i++) {
if (person * i > num) {
break;
}
result += getMax(num - i, person - 1, i);
}
}
return result;
}
private static int getMax(int num, int person, int max) {
if (person == 0 && num == 0) {
return 1;
}
if (num < 0 || person < 0) {
return 0;
}
int res = 0;
for (int i = 0; i < 4; i++) {
int moonCake = max + i;
if (moonCake * person > num) {
break;
}
res += getMax(num - moonCake, person - 1, moonCake);
}
return res;
}
}
//manfen
import functools @functools.lru_cache def calc_count(n,m,last_max): if m==0 and n==0: return 1 if n<0 or m <0: return 0 comb_count=0 moon_cakes=[last_max+i for i in range(4)] for mc in moon_cakes: if mc*m>n: break comb_count += calc_count(n-mc,m-1,mc) return comb_count def main(m,n): if m==n: return 1 else: comb_count=0 for i in range(1,n-m+2): if m*i>n: break comb_count+=calc_count(n-i,m-1,i) return comb_count if __name__=='__main__': while True: try: m,n=map(int,input().split()) print(main(m,n)) except: break
