原题链接:蓝桥杯算法提高VIP-数的划分
完全为了做笔记!!!
完全为了做笔记!!!
完全为了做笔记!!!
我也是新手,全部都是理解前面几个大佬的思路和代码
1:暴力DFS
解题思路:
就是在每次递归中循环可能的情况,当当前值加上i大于目标值就退出,没啥好说的,这道题用这种方法也能拿到高分
参考代码:
import java.io.*;
public class Main {
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static void main(String[] args) throws NumberFormatException, IOException {
int num=Integer.parseInt(bf.readLine());
//从start从1开始算
int ans=dfs(1,0,num);
pw.print(ans);
pw.flush();
}
//n为目标值,sum为当前值,start为起点
public static int dfs(int start,int sum,int n) {
int num=0;
if(sum==n) return 1;
for(int i=start;sum+i<=n;i++) {
num+=dfs(i,sum+i,n);
}
return num;
}
}2:背包问题,dp数组做法
解题思路:
创建一个二维数组dp[i][j]意为当前总和为i,限制最大取数为j的种类数
从1开始遍历到这个数,再在每次遍历中取数最高为1到i的情况,如果i==j,例如3就只能分解成3,如果j==1,例如,3分解为111,那就只有1种情况
再开始遍历其他情况,例如,3可以分解为1+2,这是分解中带上1的情况,加上是分解中最高为j的情况,就是当前情况
再从1开始加到num,把每一种最大取值情况相加,即可得答案
参考代码:
import java.io.*;
public class Main {
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static void main(String[] args) throws NumberFormatException, IOException {
int num=Integer.parseInt(bf.readLine());
int[][] dp=new int[num+1][num+1];
//i表示当前总和为i,j表示选定时最高限制为j的情况
//dp[i][j]即为当前种类数
for(int i=1;i<=num;i++) {
for(int j=1;j<=i;j++) {
//如果i和j相等,只有一种情况,j=1时,只能分解成1,也就只有1种情况
if(i==j||j==1) {
dp[i][j]=1;
}else {
//第一个为分解成1和其他数的情况
//第二个为分解成i分解掉了一个j的情况
dp[i][j]=dp[i-1][j-1]+dp[i-j] [j];
}
}
}
int sum=0;
//加上dp限制为1到num的各种情况
for(int i=0;i<=num;i++) {
sum+=dp[num][i];
}
pw.print(sum);
pw.flush();
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复