蓝桥杯B组 --- 砝码称重

2024-03-22 03:12
文章标签 蓝桥 称重 砝码

本文主要是介绍蓝桥杯B组 --- 砝码称重,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 N。

第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN

输出格式

输出一个整数代表答案。

数据范围

对于 50%50% 的评测用例,1≤N≤15。
对于所有评测用例,1≤N≤100,N 个砝码总重不超过 105。

输入样例:
3
1 4 6
输出样例:
10
样例解释

能称出的 1010 种重量是: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。

 这道题首先可以暴力dfs枚举两个方向,要么加这个数要么减去这个数,显而易见这里肯定会超时,这里有哪位大佬会如何剪枝的可以在评论区留言一下,感谢。

#include <iostream>
using namespace std;
const int N = 20;
int a[N];
int n;
bool st[100010];
bool count[40];
int num_sum = 0;
void dfs(int start ,int sum)
{if(sum > 0){st[sum] = true;//只要找到sum>0的情况就让其当前状态变为true}for(int i = start;i <= n;i++)//组合型枚举模板{if(!count[i]){count[i] = true;//+a[i]sum += a[i];dfs(i + 1 , sum);sum -= a[i];//注意还原现场//-a[i]sum -= a[i];dfs(i + 1 , sum);sum += a[i];count[i] = false;}}
}
int main()
{cin >> n;for(int i = 1;i <= n;i++){cin >> a[i];num_sum += a[i];}dfs(1,0);int ans = 0;for(int i = 1;i <= num_sum;i++){if(st[i] == true)//累加被计算出的值ans++;}cout << ans << endl;return 0;
}

最后当然只可以通过50%hhh。

第二种方法肯定就是动态规划,还是在此基础上分成两个区间,选与不选当前a[i]数,然后在选择的时候分成两种方向,一种+a[i]一种-a[i]。

那么其状态转移方程:

dp[i][j] = dp[i - 1][j] + dp[i - 1][j + a[i]] + dp[i - 1][abs(j - a[i])];

随后因为只能选一次,所以按照01背包的模板就可以写成:

#include <iostream>
using namespace std;
const int N = 120;
int dp[N][100100];
int a[N];
int main()
{int n;cin >> n;int sum = 0;for(int i = 1;i <= n;i++){cin >> a[i];sum += a[i];}  dp[0][0] = 1;for(int i = 1;i <= n;i++){for(int j = 0;j <= sum;j++){dp[i][j] = dp[i - 1][j] + dp[i - 1][abs(j - a[i])] + dp[i - 1][j + a[i]];}}int ans = 0;for(int i = 1;i <= sum;i++){if(dp[n][i])ans++;//这里的ans跟上面那个dfs的作用一样}cout << ans << endl;return 0;
}

这篇关于蓝桥杯B组 --- 砝码称重的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834423

相关文章

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

12个小球 梅氏砝码问题

1. 12个小球,其中有一个是坏球。有一架天平。需要你用最少的称次数来确定哪个小球是坏的并且它到底是轻还是重。 来源:http://blog.csdn.net/pongba/article/details/2544933 这个问题是一道流传已久的智力题。网络上也有很多讲解,还有泛化到N个球的情况下的严格证明。也有零星的一些地方提到从信息论的角度来看待最优解法。本来我一直认

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<stdio.h>#define MAX 100void findmin(int a[],int n,int& pos){int min=a[0];pos=0;//pos=0我开始忘了,特别注意

第十五届蓝桥杯图形化省赛题目及解析

第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序,角色会说( )? A、29     B、31     C、33     D、35 正确答案:C 答案解析: 重复执行直到m>n不成立,即重复执行直到m<=n。所有当m小于或者 等于n时,循环结束。循环过程中变量m与变量n的变化如下表: 通过上述表格可知,循环到第五次循环结束。m的值为14,n的值为19

第八届蓝桥杯 最大公共子串(动态规划)

标题:最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。 #include <stdio.h

蓝桥杯第八届 方格分割(dfs)

标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。   观察可得他是一个中心对称图形,我们只需要搜索它的对称线即可。我们可以把对称线抽象为从(

蓝桥杯备赛day02:递推

斐波那契数列 #include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;int dp[n+1];dp[1]=1;dp[2]=1;for(int i = 3;i <= n;i++) dp[i] = dp[i-1]+dp[i-2];cout<<dp[n];return 0;} n = int(input())