老板一共需要给某个员工发奖金n元,可以选择一次发1元,也可以选择一次发2元,也可以选择一次发3元。请问老板给这位员工发放完n元奖金共有多少种不同的方法?
数据范围:1 <= n <= 10
2
2
一共有2元奖金,有两种发放方法;第一中:分别每次发放1元,两次发放完,第二种一次全部发放完
3
4
一共有3元奖金,有4种发放方法;第一种:分别每次发放1元,3次发放完,第二种先第一次发2元,第二次发1元; 第三种第一次发1元,第二次发2元; 第四种方法一次全部发放完
输入参数为一个整数数字,输出为一个整数数字
public class GiveMoney { public static void main(String[] args) { Scanner scanner = new Scanner (System.in); System.out.print ("输入要发的奖金:"); int number = scanner.nextInt (); System.out.println ("您有" + f (number) + "种方法发完" + number + "元奖金!!"); } /** * 获取 发奖金可用的总方法 的方法 * * @param number 要发的钱数 * @return 总方法数 */ public static int f(Integer number) { // 设置递归结束条件 if (number == 1) { return 1; } // 实现 f(n) = f(n-1) + f(n-2) + ... + f(1) + 1 int count = 0; for (int i = number - 1; i >= 1; i--) { count = f (i) + count; } return count + 1; } }
function CalulateMethodCount( num_money ) { // write code her if (num_money == 1) return 1; if (num_money == 2) return 2; if (num_money == 3) return 4; let dp = new Array(num_money + 1).fill(0); dp[1] = 1; dp[2] = 2; dp[3] = 4; for (let i = 4; i <= num_money; ++i) { dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]; } return dp[num_money]; } module.exports = { CalulateMethodCount : CalulateMethodCount };
int CalulateMethodCount(int num_money ) { // write code here // 设置递归结束条件 if(num_money==1){ return 1; }else if(num_money==2){ return 2; }else if(num_money==3){ return 4; } int count=0; for(int i=num_money-1;i>=num_money-3;i--){ count+=CalulateMethodCount(i); } return count; }
public class other_3 { /*思路: 以5元为例 先发1元,剩下4元就和一共发4元的方法一样了。 先发2元,剩下3元就和一共发3元的方法一样了。 先发3元,剩下2元就和一共发2元的方法一样了。 也即:f(n)=f(n-1)+f(n-2)+f(n-3) */ public int CalulateMethodCount(int num_money) { // write code here return dfs(num_money); } int dfs(int money) { if (money==1) return 1; if (money==2) return 2; if (money==3) return 4; return dfs(money-1)+dfs(money-2)+dfs(money-3); } }
/** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ function CalulateMethodCount( num_money ) { // write code here let dp = new Array(num_money).fill(0); dp[1] = 1; dp[2] = 2; dp[3] = 4; for (let i = 4; i <= num_money; i++) { dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]; } return dp[num_money]; } module.exports = { CalulateMethodCount : CalulateMethodCount };
import java.util.*; //可以参考下爬楼梯,可以走1步2步或者3步,走到目标阶层 public class Solution { /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ public int CalulateMethodCount (int num_money) { // write code here int[] arr = new int[]{1,2,3}; int[] dp = new int[num_money + 1]; dp[0] = 1; for(int i = 1;i <= num_money;i++){ for(int j = 0;j < 3;j++){ if(arr[j] <= i) dp[i] += dp[i - arr[j]]; } } return dp[num_money]; } }
//回溯法
public class Solution {
static int count = 0; public int CalulateMethodCount (int num_money) { // write code here int[] arr = {1,2,3}; backTracking(arr,num_money,0); return count; } public void backTracking(int[] arr,int n,int sum){ if(sum == n){ count++; return; } for (int i = 0; i < arr.length; i++) { if(sum+arr[i] > n){ break; } sum += arr[i]; backTracking(arr,n,sum); sum -= arr[i]; } }
}
package main /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ func CalulateMethodCount(num_money int) int { // write code here if num_money == 1 { return 1 } if num_money == 2 { return 2 } if num_money == 3 { return 4 } return CalulateMethodCount(num_money-1) + CalulateMethodCount(num_money-2)+ CalulateMethodCount(num_money-3) }斐波那契数列的简单应用
class Solution: def CalulateMethodCount(self , num_money ): # write code here if num_money<=0: return 0 if num_money==1: return 1 if num_money==2: return 2 if num_money==3: return 4 a=4 b=2 c=1 sum1=0 for i in range(4,num_money+1): sum1 = a+ b + c c = b b = a a=sum1 return sum1
package main /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ func CalulateMethodCount( num_money int ) int { // write code here slove := make([]int, num_money+1) slove[0] = 1 slove[1] = 1 slove[2] = 2 slove[3] = 4 if num_money <= 3 { return slove[num_money] } for i := 4; i <= num_money; i++ { slove[i] = slove[i-1] + slove[i-2] + slove[i-3] } return slove[num_money] }
# # # @param num_money int整型 奖金的总数,单位为元 # @return int整型 # from functools import * @lru_cache(maxsize=None) def func(n): # write code here if n==1: return 1 elif n==2: return 2 elif n==3: return 4 else: return func(n-1)+func(n-2)+func(n-3) class Solution: def CalulateMethodCount(self , n): return func(n)
import java.util.*; public class Solution { /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ public int CalulateMethodCount (int num_money) { // write code here fajangjin(0,num_money); return result; } private Integer result = 0; private void fajangjin(int c, int n) { if(c == n) { result++; return ; } for(int i=1;i<=3;i++){ if(c+i<=n){ fajangjin(c+i, n); } } } }
package main /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ func CalulateMethodCount( num int ) int { if num == 0 { return 0 } else if num == 1 || num == 2 { return num } else if num == 3 { return 4 } return CalulateMethodCount(num-1) + CalulateMethodCount(num-2) + CalulateMethodCount(num-3) }
class Solution { public: /** * * @param num_money int整型 奖金的总数,单位为元 * @return int整型 */ int CalulateMethodCount(int num_money) { // write code here vector<int> dp(num_money + 1, 0); dp[0] = 1; for(int i = 1;i <= num_money;i++) { dp[i] += dp[i-1]; if(i > 1) dp[i] += dp[i-2]; if(i > 2) dp[i] += dp[i-3]; } return dp[num_money]; } };