第12届蓝桥杯 第七题:《砝码称重》的两种解法dfs和dp算法
第七题:《砝码称重》
题目大意
解题思路
思路1:用闫氏dp分析法:
注意dp[i-1] [j+w[i]] ,这里j+w[i]会产生越界,需要将砝码重量上限100000改成200000;
for (int i =1; i <= n; i++) {for (int j = 0; j <= s; j++) {//有一个等于j,那么就砝码组成的质量就可以等于jdp[i][j] = dp[i-1][j] || dp[i-1][Math.abs(j-w[i])] || dp[i-1][j+w[i]];}}
思路2:dfs暴力搜索
dfs记住:找重复,找变化,找边界 来写dfs的函数。
预定义一个count数组,来存放0-100000的所有数据。每得到一个大于0的重量sum,就令count[sum] = 1。
最后打印count数组中为1的数,即可。
但是结果会超时,只能拿一半的分数。
private static void dfs(int x,int[] w,int sum,int[] count) {//下一个使用砝码的下标,砝码数组,当前用到砝码的总重量if (x == w.length) {if (sum > 0) {count[sum] = 1;}return;}dfs(x+1,w,sum+w[x],count);//加上第x个砝码dfs(x+1,w,sum,count);//不加第x个砝码dfs(x+1,w,sum-w[x],count);//减去第x个砝码}
完整代码
代码1:用闫氏dp分析法:
import java.util.*;
//背包
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = 100;int n = scanner.nextInt();//砝码总数int[] w = new int[N+1]; //砝码大小int M = 200000;int s = 0;//砝码总重量for (int i = 1; i <= n; i++) {//N个砝码的大小w[i] = scanner.nextInt();s += w[i];}boolean[][] dp = new boolean[N+1][M+1];//前i个砝码重量是否为jdp[0][0] = true;//DP算法for (int i =1; i <= n; i++) {for (int j = 0; j <= s; j++) {//有一个等于j,那么就砝码组成的质量就可以等于jdp[i][j] = dp[i-1][j] || dp[i-1][Math.abs(j-w[i])] || dp[i-1][j+w[i]];}}//用count计数int count = 0;for (int j =1 ; j <=s; j++) {if (dp[n][j]) {count++;}}System.out.println(count);}
}
代码2:dfs暴力搜索
import java.util.*;
//dfs暴力
public class Main{static int N = 100;//最大砝码数static int M = 100000;//最大重量static int[] count = new int[M+1];public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();//取的砝码数int[] w = new int[n];for (int i = 0; i < n; i++) {w[i] = scanner.nextInt();//砝码的大小}//DFSdfs(0,w,0);//遍历count数组int s = 0;for (int i = 0; i < count.length; i++) {if (count[i] == 1) {s++;}}//打印结果System.out.println(s);}private static void dfs(int x,int[] w,int sum) {//下一个使用砝码的下标,砝码数组,当前用到砝码的总重量// TODO Auto-generated method stubif (x == w.length) {if (sum > 0) {count[sum] = 1;}return;}dfs(x+1,w,sum+w[x]);//加上第x个砝码dfs(x+1,w,sum);//不加第x个砝码dfs(x+1,w,sum-w[x]);//减去第x个砝码}
}
第12届蓝桥杯 第七题:《砝码称重》的两种解法dfs和dp算法相关推荐
- 第12届蓝桥杯 第三题:《卡片》
第三题:<卡片> 题目大意 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 解题思路 首先建立一个map映射,将0–9 每个卡片各有2021个存入map: Has ...
- 第12届蓝桥杯 第一题:《直线》
2021年第12届蓝桥杯竞赛 第一题:<直线> 题目大意 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 在平面直角坐标系中,两点可以确定一条直线. 给定平面上 ...
- 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...
- 第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第128讲. 第12届蓝桥杯Scratch国赛真题,这 ...
- 女巫的魔法-第12届蓝桥杯Scratch省赛3真题第2题
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第44讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2021年4月24日举行的第二次省赛考 ...
- 植树节种树-第12届蓝桥杯Scratch选拔赛真题精选
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第87讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...
- 求逆序数-第12届蓝桥杯Scratch省赛3真题第3题
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第43讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2021年4月24日举行的第二次省赛考 ...
- 绘制同心圆-第12届蓝桥杯Scratch省赛1真题第3题
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第53讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2020年10月19日举行的第一次省赛 ...
最新文章
- 使用Python,OpenCV在视频中进行实时条形码检测
- 爱奇艺火爆的背后,个性化推荐排序是如何配合的?
- 放弃OpenStack?恐怕还不到时候
- 实验二十二 SCVMM中的SQL Server配置文件
- 11-机器学习开发流程--初识
- Sublime Text 设置在标签页中打开文件
- Linux服务器配置秘钥对连接
- Java1.8接口方法都是抽象_抽象类和接口的区别以及jdk1.8之后接口里面可以实现方法...
- 在Oracle中添加用户登录名称
- 雕虫晓技(十) Android超简单气泡效果
- 如何使用extern在源文件之间共享变量?
- 2021-08-22 过滤器实现登录权限拦截
- python填空题及答案知乎_zhihu-python
- 频率域滤波去除周期性噪声
- informix的安装步骤
- 使用arcgis修改行政区划图边界
- 中国微型电动汽车市场趋势报告、技术动态创新及市场预测
- python 统计检验_常用统计检验的Python实现(附完整代码)
- 机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导
- 实现一个B站弹幕不挡人物的效果