砝码称重(第十二届蓝桥杯省赛第一场C++A/B/研究生组)
突然决定要参加蓝桥,已经超级久没复习C/C++的我考前还是决定打几道题捡一捡C/C++的语法和思路。
2023年蓝桥的题之后会出,因为 AcWing上还没有出可以测试的程序,也没把握说自己考场上做的就是对的。
题目
你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W 1 W_1 W1, W 2 W_2 W2,⋅⋅⋅, W N W_N WN。
请你计算一共可以称出多少种不同的正整数重量?
注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数: W 1 W_1 W1, W 2 W_2 W2,⋅⋅⋅, W N W_N WN。
输出格式
输出一个整数代表答案。
数据范围
对于 50% 的评测用例,1≤N≤15。
对于所有评测用例,1≤N≤100,N 个砝码总重不超过 1 0 5 10^5 105。
输入样例:
3
1 4 6
输出样例:
10
样例解释
能称出的 10 种重量是:1、2、3、4、5、6、7、9、10、11。
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
9 = 4 + 6 − 1;
10 = 4 + 6;
11 = 1 + 4 + 6。
想法
想法很朴素。这么多东西,一下子放进来算,肯定算不明白,那只能一个一个来。
一个一个来,那怎么表示第 i 个进来之前的之前的结果?
噢吼~
这不是动态规划的思想嘛。
那就设计下动态规划的表示。目测这个dp[][]
应该具有三要素:
- 到第几个了
- 到这里的方案数
- 到这里之前有的方案是哪些
瞄一眼总重不超过 1 0 5 10^5 105,大胆设 dp[i][j]
表示加入第 i 个砝码时,重量 j 是不是被用了。(emmmm?好像又不是动态规划了……)
状态转移方程:dp[i][j]=max(max(dp[i-1][j], dp[i-1][j-a[i]]), dp[i-1][j+a[i]])
其中 a[i] 表示第 i 个砝码的重量
结果:sum(dp[n]) 对最后一个砝码放入后的结果求和。
注意点:
- 重量可能为负数(例如 9 可能是这么算出来的:
(3-4)+10
),所以要加offset
表示负数。 - 空间问题,加加减减的可能导致数组越界了,记得加个判断。
- 空间问题,怕数组开大了,采用滚动dp,不储存之前的结果。
代码
#include<bits/stdc++.h>
using namespace std;
int N;
// 负数
const int offset = 100052;
// 总数
const int maxn = offset+100052;
// 砝码
int a[1005];
// 滚动dp
int dp[2][maxn];// sort 用的(实际上没什么用,复习一下罢了)
bool cmp(int a,int b){return a>=b;
}int main(){cin>>N;// 初始化为0memset(dp,0,sizeof(dp));int n = 1;while(cin>>a[n]){n++;}// 排序(没什么用其实,可以不要)sort(a+1,a+n,cmp);// 对 0 置 1dp[0][offset]=1;for(int i=1;i<n;i++){for(int j=0;j<maxn;j++){// 判断一下,怕 段错误if(j+a[i]<maxn && j-a[i]>0)dp[1][j] = max(max(dp[1-1][j], dp[1-1][j-a[i]]),dp[1-1][j+a[i]]);}// dp滚动一下for(int j=0;j<maxn;j++){dp[0][j] = dp[1][j];}
// 可以输出看看
// for(int j=offset+1;j<maxn;j++)
// if (dp[0][j]>0)
// cout<<j-offset<<"\n";
// cout<<"\n\n";}// 统计结果int count = 0;for(int i=offset+1;i<maxn;i++){if(dp[0][i]>0){count++;
// cout<<dp[n-1][i]<<"\n";}}cout<<count;return 0;
}
AC(可能是因为题目条件比较松……)
砝码称重(第十二届蓝桥杯省赛第一场C++A/B/研究生组)相关推荐
- 砝码称重 第十二届蓝桥杯B组
你有一架天平和 NN 个砝码,这 NN 个砝码重量依次是 W1,W2,⋅⋅⋅,WNW1,W2,···,WN. 请你计算一共可以称出多少种不同的正整数重量? 注意砝码可以放在天平两边. 输入格式 输入的 ...
- 第十二届蓝桥杯省赛第二场C++B组真题 【未完结】
目录 3496. 特殊年份 [简单] 3490. 小平方 [简单] 3491. 完全平方数[简单数论] 3492. 负载均衡[小根堆模拟] 3496. 特殊年份 [简单] #include<bi ...
- 2021年第十二届蓝桥杯省赛第二场Python组(真题+解析+代码):双阶乘
1 真题 2 解析 难度系数:⭐ 考察题型:数论 涉及知识点: 双阶乘 思路分析: 啊这,竟然遇到了小学数学题:找规律.老铁,拿捏了! 规律:后一项都比前一项少个2,2021!!=2021*2019* ...
- 第十二届蓝桥杯省赛详解
试题A:空间 1B是8位,32位二进制数占用4B空间,1MB=2^10KB=2^20B 那么可以存放32位二进制数的个数为256*2^20*8/32=67108864 试题B:卡片 分析:因为数据只有 ...
- 2021年第十二届蓝桥杯省赛C/C++B组题解总结
前几天(2021.4.18)刚刚比完了2021年第十二届蓝桥杯省赛,本人参加的是软件组C++B组的比赛,本文包括了这一届C++B组的题目以及部分题解.感悟和总结. 目录 试题A.空间 试题B.卡片 试 ...
- 第十二届蓝桥杯省赛 Java 大学 B 组—砝码称重—满分百分题解
第十二届蓝桥杯省赛 Java 大学 B 组-砝码称重-满分百分题解 一.解题思路 1.解法一( Java ) 解法思路:简单模拟 ☝ArrayList 遍历 + HashSet 存储(去重) 伪代码如 ...
- 2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)
2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛) A:ASC B:卡片 C:直线 D:货物摆放 E:路径 Floyed Dijkstra F:时间显示 G:最少砝码 H:杨辉三角形 I: ...
- 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解
文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...
- 十二届蓝桥杯省赛B组C++解析(填空题部分)
十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...
最新文章
- shellinabox的安装使用
- 二维数组的对角搜索C++
- 郁金香汇编代码注入怎么写看雪_雷军1994年写的诗一样的代码,我把它运行起来了!...
- 牛客网未通过代码---
- 挖掘经典:几乎被人遗忘的HTML七种用法 (转)
- jmeter通过ant执行时报错 jmeter.log not found
- matplotlib(一):散点图
- COM编程之四 引用计数
- html怎么做成响应式的,怎么用html5完成响应式布局?
- EXCEL 学习步骤总结
- x299服务器芯片,X299比X399差在哪? 两大平台产品比拼
- 使用WINPE制作U盘启动
- MTK 11A MAINMENU
- 安全组-出入战规则设置
- 那些好玩的生成器网站
- Oracle (temporary tablespace)临时表空间说明
- 阿里M8级铁子整理出SQL手册:收获不止SQL优化,抓住SQL的本质
- 使用Dev C++运行c语言代码时碰到Failed to executeC:\c++.cpp: Error 0 :操作成功完成
- 微信装修装饰小程序源码开发方案
- [681]小米手机安装charles证书,提示“没有可安装的证书”
热门文章
- 郭光灿--奇妙的量子世界笔记2(量子力学的解释)
- Unreal Open Day游记
- 裁员滚滚,这个冬天有点冷 | 程序员有话说
- 九阴白骨爪(2)Ubuntu20.04下配置环境(MySQL/Anaconda/Django)
- Linux九阴真经之九阴白骨爪残卷1(加密和安全)
- 大家好,希望与君共勉
- 华硕服务器 系统安装win7系统,华硕主板u盘装win7系统 华硕主板装u盘系统安装win7...
- STM32F103移植LiteOS保姆级教程(基于Ubuntu平台)
- 系统试运行报告是谁写的_费控系统项目实施情况说明
- 浮点数(实数)中单精度与双精度区别