老板一共需要给某个员工发奖金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];
}
};