蓝桥杯1447 砝码称重

问题描述

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

请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。

输入格式

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

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

输出格式

输出一个整数代表答案。

样例输入

复制代码
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。

评测用例规模与约定

对于 50的评测用例,1≤N≤15。

对于所有评测用例,1≤N≤100,N1≤N≤100,N​个砝码总重不超过 100000。

cpp 复制代码
#include<iostream>
#include<cmath>
using namespace std;

const int N = 110;
const int M = 2e5+10;  //j的范围是 [-m, m],M为最大可能重量的两倍
int n;
int m;  //总重量
int w[N];
bool f[N][M];  //f[i][j]:前i个砝码能否称出重量j
int ans;

int main()
{
	cin>>n;
	for(int i=1; i<=n; ++i)
	{
		cin>>w[i];
		m += w[i];
	}
	
	f[0][0]=1;  //初始化:0个砝码称出0
	
	//枚举前i个砝码
	for(int i=1; i<=n; ++i)
	{
		//枚举所有可能的重量
		for(int j=0; j<=m; ++j)
		{
			//不选当前砝码 || 选砝码放到左盘 || 选砝码放到右盘
			f[i][j]=f[i-1][j] || f[i-1][abs(j-w[i])] || f[i-1][j+w[i]];
		}
	}
	
	for(int i=1; i<=m; ++i)
	{
		if(f[n][i]) ans++;
	}
	
	cout<<ans;
	
	return 0;
}
相关推荐
@––––––10 小时前
力扣hot100—系列2-多维动态规划
算法·leetcode·动态规划
xsyaaaan10 小时前
代码随想录Day31动态规划:1049最后一块石头的重量II_494目标和_474一和零
算法·动态规划
我是咸鱼不闲呀16 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
老鼠只爱大米18 小时前
LeetCode经典算法面试题 #78:子集(回溯法、迭代法、动态规划等多种实现方案详细解析)
算法·leetcode·动态规划·回溯·位运算·子集
xsyaaaan1 天前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
我是咸鱼不闲呀2 天前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
xhbaitxl2 天前
算法学习day39-动态规划
学习·算法·动态规划
xhbaitxl2 天前
算法学习day38-动态规划
学习·算法·动态规划
2501_924878732 天前
数据智能驱动进化:AdAgent 多触点归因与自我学习机制详解
人工智能·逻辑回归·动态规划
YYuCChi3 天前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划