题解 | #放苹果#
放苹果
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)