题解 | #放苹果#
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) // 递归写法: /* 递归退出条件: 苹果数只有1个,放哪个盘子都一样,方案为1 苹果数为0,放置已经完成,方案为1 盘子数为1,则手上的所有苹果都会放在这一个盘子中,方案为1 */ // 如果盘子数大于苹果树:则必定有n-m个盘子空着,不会影响总的方案书,所以f(m,n)等价于f(m,m) /* 如果盘子数小于等于苹果数:则考虑是不是放满所有盘子。如果至少空一个盘子,则有f(m,n-1);如果不要空盘子,则每个盘子至少放了一个苹果,放了不会影响方案总数,因此有f(m-n,n)个方案 */ /*function solution(m,n){ if(m === 0 || m === 1 || n === 1){ return 1 }else if(n > m){ return solution(m,m) }else{ return solution(m,n-1) + solution(m-n,n) } } rl.on('line',function(line){ const arr = line.split(' ').map(item => +item) const res = solution(arr[0],arr[1]) console.log(res) })*/ /* 动态规划:处理边缘节点(苹果数只有1个,放哪个盘子都一样,方案为1 苹果数为0,放置已经完成,方案为1 盘子数为1,则手上的所有苹果都会放在这一个盘子中,方案为1) */ // dp[i][j] 表示对于i个苹果和j个盘子有多少种放置方案 /* * 两种情况: * 当 i < j 时,苹果数量比盘子数量少,盘子一定会空,因此当前状态转移方程为 dp[i][j] = dp[i][i]; * 当 i >= j 时,苹果数量多于盘子,则考虑是不是每个盘子都装苹果,如果不装满盘子,至少有一个盘子不装,方案有 dp[i][j-1];如果装满盘子,每个盘子中至少有一个苹果, * 相当于都去掉一个苹果后再分配,方案有 dp[i-j][j]。因此状态转移方程为 dp[i][j] = dp[i-j][j] + dp[i][j-1] * * 综上:状态转移方程为 dp[i][j] = { * dp[i][i] if(i<j) * dp[i-j][j] + dp[i][j-1] if(i>=j) * } * */ function solution(m,n){ // j为0代表1个盘子,i为0代表0个苹果,i为1代表1个苹果(因为题目规定苹果可以为0,盘子最少是1) // 这里的j长度为n,i苹果数是加上了1的基础,j就是从0到n-1,所以在进行i、j代换时,需要有一个1的差值,不是很方便后续表达式代换 const dp = new Array(m+1).fill(0).map(item => []) for(let j=0;j<n;j++){ dp[0][j] = 1 dp[1][j] = 1 } for(let i=0;i<m+1;i++){ dp[i][0] = 1 } for(let i=2;i<m+1;i++){ for(let j=1;j<n;j++){ if(i < j+1){ dp[i][j] = dp[i][i-1] }else{ dp[i][j] = dp[i-j-1][j] + dp[i][j-1] } } } // console.log(dp) console.log(dp[m][n-1]) } /* function solution(m,n){ // j为1代表1个盘子,i为0代表0个苹果,i为1代表1个苹果。 // 这里定义的j的长度为n+1,是与i苹果的数目一样在基础上加了1的,方便后面的表达式书写 const dp = new Array(m+1).fill(0).map(item => []) for(let j=1;j<n+1;j++){ dp[0][j] = 1 dp[1][j] = 1 } for(let i=0;i<m+1;i++){ dp[i][1] = 1 } for(let i=2;i<m+1;i++){ for(let j=2;j<n+1;j++){ if(i < j){ dp[i][j] = dp[i][i] }else{ dp[i][j] = dp[i-j][j] + dp[i][j-1] } } } // console.log(dp) console.log(dp[m][n]) } */ rl.on('line',function(line){ const arr = line.split(' ').map(item => +item) solution(arr[0],arr[1]) })