题解 | #放苹果#
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
#include <iostream>
using namespace std;
int count(int n, int m, int up){ //在n个盘子里放m个苹果
if(n == 0 || m == 0) return 1; //如果没苹果或者没盘子都是返回一个成功的放置
int ans = 0;
int po = m % n ? m / n + 1: m / n; // 这里是为了判断是否相等,如果能整除的话
int start = up > m ? m : up;//i的起点不能比上一个更高
for(int i = start; i >= po; --i){ //现在的盘子放i个苹果,剩下的盘子交给其余的n-1个盘子放
ans += count(n - 1, m - i, i); // 剩余了m-i个苹果以及n-1个盘子
}
// cout << m <<" "<< n <<" "<< ans << endl;
return ans;
}
int main() {
int m, n;
cin >> m >> n;
cout << count(n, m, m) << endl;
}
// 64 位输出请用 printf("%lld")
代码不是很简洁,主要思想就是后边盘子里的苹果不能大于前边盘子放到苹果,比如7个苹果放到三个盘子里就是如下几种;
(7,0,0) (6,1,0) (5,2,0) (5,1,1) (4,3,0) (4,2,1) (3,3,1) (3,2,2)
查看9道真题和解析