2021蓝桥杯B组 G题砝码称重

题目大意: 

 解法一:

首先想到的是可以用广度优先搜索的方式来进行暴力求解,通过使用递归来将每一种方法遍历,并且标记,不过由于此方法的时间复杂度是O(n3),故使用暴力搜索只能完成50%的评测用例,只能得一半的分。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6;
int vis[maxn];//记录每种称重是否出现过
int a[maxn];//N个砝码的重量
int N;//砝码的数量
void dfs(int sum, int i)//sum:当前已选用砝码的总重量 i:下一个将要选用砝码的序号
{
	if (i == N)
	{
		if (sum >= 0)
			vis[sum] = 1;
		return;
	}
	dfs(sum + a[i], i + 1);//把a[i]放在右边
	dfs(sum, i + 1);      //不选a[i]
	dfs(sum - a[i], i + 1);//把a[i]放在左边
}
int mai
蓝桥杯砝码称重是经典的算法目之一,通常出现在竞赛训练库中。这个问的核心在于通过给定的一砝码重量以及天平的操作规则,求解能够称出的最大重量范围或者特定条件下能称出的所有可能的重量。 ### 目背景 假设有一个天平和一砝码,并给出每种砝码的数量及对应的重量值(例如有3个1克的砝码、2个5克的砝码等)。目标是计算这砝码可以合出的不同重量总数是多少,或者是最大可称量多少。 --- #### **解法思路** 为了更好地解决这类问,我们需要明确以下几个关键点: 1. **状态表示** 使用动态规划的思想,将每个物品看作一种选择机会。设`dp[i]` 表示是否可以通过当前选取某些砝码得到重量i 。初始化时只有 `dp[0]=true` 因为我们默认存在零重量情况即什么都不放的状态。 2. **遍历顺序** 对于每一个类型的砝码k (其单件质量为w[k]) ,从最小到大枚举所有可能放置数量n_k , 更新新的可达权重集合。 3. **转移方程** 假如现在处理第j 种砝码并且该种最多可用num[j] 次,则对于之前已经标记过的可行总重量x : - 如果 x + w * i ≤ MAX_WEIGHT 则尝试设置 dp[x+w*i ] = true 4. 最终统计有多少个位置上dp数元素变为真即可获得答案——也就是总的不重复的有效整数重量数目。 --- #### 示例程序(Python) ```python def max_weight(weighs, nums): # 初始化DP表,默认只能达到0kg limit = sum([a*b for a,b in zip(weighs,nums)])+1 dp = [False]*limit dp[0] = True for idx,wgt in enumerate(weighs): temp_dp=[d for d in dp] count=nums[idx]+1 current_sum=wgt while(current_sum<limit and count>0): if(temp_dp[current_sum-wgt]==True): dp[current_sum]=True current_sum+=wgt; count-=1; return len([v for v in dp if v]) # 测试数据输入部分开始 if __name__ == "__main__": weights=input().strip().split(',') numbers=input().strip().split(',') int_weights=list(map(int,weights)) int_numbers=list(map(int,numbers)) print(max_weight(int_weights,int_numbers)) ``` 上述伪代码片段展示了如何利用布尔型列表模拟所有的可能性并最终得出结果计数值过程的一个简化版本示意而已实际比赛中需要考虑边界条件更细致些! ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值