活动发起人@小虚竹 想对你说:
这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!
提醒:在发布作品前,请将不需要的内容删除。
一、题目描述
输入一个自然数 n (n≤1000)n (n≤1000),我们对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止。
问总共可以产生多少个数。
输入描述
输入一个正整数 nn。
输出描述
输出一个整数,表示答案。
输入输出样例
输入
6
输出
6
二、代码展示
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int num = 1;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n =scan.nextInt();
f(n);
System.out.println(num);
scan.close();
}
public static void f(int n){
if(n == 1){
return ;
}
for(int i =1 ;i <= (int)n/2 ; i++){
f(i);
num++;
}
}
}
三、优化
考虑到n的值会变大,递归的方法可能会使栈溢出,所以可以考虑用动态规划的方法来优化过程
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
long[] dp = new long[n + 1];
dp[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = i; j <= n; j++){
dp[j] += dp[j - i];
}
}
System.out.println(dp[n]);
scan.close();
}
}