蓝桥杯每日一题2023.9.19

蓝桥杯2021年第十二届省赛真题-砝码称重 - C语言网 (dotcpp.com)

题目描述

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

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

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

分析

可以使用DP将dp[i][j]表示只从前i个物品中选,且总重量为j的方案的集合,其属性是是否选用(bool)

一共有三种方案

方案一:不选第i个物品

方案二:将第i个物品加上(将第i个物品放在右边)

方案三:将第i个物品减去(将第i个物品减去)

注:为了防止减去第i个物品数组的标号为负数,需要加上一个值,使之始终为正数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 200010, b = M / 2;
int n, m, ans, w[N], dp[N][M];
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> w[i];
		m += w[i];
	}
	dp[0][b] = 1;
	for(int i = 1; i <= n; i ++)
	{
		for(int j = -m; j <= m; j ++)
		{
			dp[i][j + b] = dp[i - 1][j + b];
			if(j - w[i] >= -m)dp[i][j + b] |= dp[i - 1][j - w[i] + b];
			if(j + w[i] <= m)dp[i][j + b] |= dp[i - 1][j + w[i] + b];	
		}
	}
	for(int i = 1; i <= m; i ++)
	{
		if(dp[n][i + b] == 1)ans ++;
	}
	cout << ans;
	return 0;
}
相关推荐
Kuo-Teng8 小时前
LeetCode 279: Perfect Squares
java·数据结构·算法·leetcode·职场和发展
CoderYanger9 小时前
B.双指针——3194. 最小元素和最大元素的最小平均值
java·开发语言·数据结构·算法·leetcode·职场和发展·1024程序员节
吃着火锅x唱着歌12 小时前
LeetCode 面试题 16.24.数对和
算法·leetcode·职场和发展
吃着火锅x唱着歌13 小时前
LeetCode 1679.K和数对的最大数目
算法·leetcode·职场和发展
我还可以再学点13 小时前
八股文面试攻略四:网络篇
网络·面试·职场和发展
王中阳Go13 小时前
面试被挂的第3次,面试官说:你懂的LLM框架,只够骗骗自己
面试·职场和发展
川西胖墩墩15 小时前
流程图在算法设计中的实战应用
数据库·论文阅读·人工智能·职场和发展·流程图
不会写DN18 小时前
[特殊字符]开班会时由于太无聊,我开发了一个小游戏……
程序人生·信息可视化·职场和发展·交互·图形渲染·学习方法·高考
Kuo-Teng18 小时前
LeetCode 23: Merge k Sorted Lists
算法·leetcode·职场和发展
南山小乌贼18 小时前
集成电路综合总结面试宝典十五
面试·职场和发展·硬件工程师·pcb·硬件测试·硬件面试·集成电路面试