当前位置: 首页 > article >正文

砝码称重(2021年蓝桥杯)

【问题描述】

     你有一架天平和N个砝码,这N个砝码的重量依次是w1,w2,……,wn。(1~n为下标)

     请你计算利用N个砝码一共可以称出多少种不同的重量?

   【注意】砝码可以放在天平的两边

【输入格式】

   第一行包含一个整数N。

   第二行包含N个整数w1,w2,……,wn。(1~n为下标)。

【输出格式】

 一个整数,代表答案

【样例输入】

  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%的评测用例, N >= 1 &&N<=15

对于所有评测用例 ,N <= 1&& N <= 100,N个砝码的总重量不超过100000。

【试题解析】

 本题也是一道典型的动态规划题目。

     设状态dp[i][j]表示i个砝码可称出重量j,则状态转移方程为1为dp[i][j]=dp[i-1][j],该方程表示i-1个砝码所能称出的重量i个砝码也能称出来,状态转移方程2为dp[i][j] = dp[i][abs(j-a[i])]

     该方程表示加入第i个砝码,看是否能称出i-1个砝码未能称出的重量。

     程序首先从第1个砝码开始,当有新的砝码i加入时,一共分成以下三种情况。

    (1)当前重量j刚好等于加入的砝码a[i]

     将当前的dp[i][j]状态设为1.

     (2)当前重量j大于加入的砝码a[i]

      dp[i][j] = dp[i-1][j-a[i]],该状态表示j是否能由i-1个砝码能称出的重量与a[i]相加而得。

      (3)当前重量j小于加入的砝码a[i]

       dp[i][j] = dp[i-1][a[i]-j],该状态表示j是否能由a[i]减去i-1个砝码所能称出的重量而得。

      输入样例如下:

     

a[i]a[1]a[2]a[3]
146

dp[i][j]状态矩阵如下

【参考程序如下】

       

#include <iostream>
long long dp[102][100002] = {0}; 
using namespace std;
int main(int argc, char** argv) {
	int a[102];
	int n;
	int sum = 0;
	cin >> n;
	for(int i = 1; i <= n;i++)
	{
		cin >> a[i];
		sum += a[i];      // i个砝码所能称出的最大重量是sum 
	}
	for(int i = 1; i <= n; i++)
	    for(int j = 1; j <= sum; j++)
	     {
	     	dp[i][j] = dp[i - 1][j];   //继承i-1的性质
			if(!dp[i][j])
			{
			    if(j == a[i])dp[i][j] = 1;
     			else if(j > a[i]) dp[i][j] = dp[i - 1][j - a[i]];
				else dp[i][j] = dp[i - 1] [a[i] - j];
			}
		}
				int count = 0;
				for(int i = 1; i <= sum;i++)
				  if(dp[n][i]) count++;
				  cout << count;
		
				//  reutrn 0; 	 
}
	

【程序运行结果如下】


http://www.kler.cn/a/457538.html

相关文章:

  • 如何使用Termux 通过 SSH 连接到远程服务器
  • NCCL源码解读3.1:double binary tree双二叉树构建算法,相比ring环算法的优势
  • 四、VSCODE 使用GIT插件
  • IIS设置IP+端口号外网无法访问的解决方案
  • 【华为OD-E卷 - 最优资源分配 100分(python、java、c++、js、c)】
  • Mac 版本向日葵退出登录账号
  • 一文读懂高斯混合模型
  • c++ 17 里新出现的修饰符 [ [ maybe_unused ] ]
  • [Leetcode] 最大子数组和 [击败99%的解法]
  • 向bash shell脚本传参
  • 基于Vue+SSM+SpringCloudAlibaba书籍管理系统
  • 十六、流编辑器sed(stream editor)
  • 【超级详细】七牛云配置阿里云域名详细过程记录
  • Tomcat(103)Tomcat的连接器故障排除
  • 嵌入式入门Day35
  • WSL2桥接模式配置(可与外部设备互ping)
  • workman服务端开发模式-应用开发-vue-element-admin封装websocket
  • 139.《python中的正则详解》
  • 解决编译Wireshark4.4.2源码失败的问题
  • Java8-Function的使用之读取文件
  • 【Linux基础】进程(上) —— 概念、状态、优先级与环境变量
  • 前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
  • 使用Quick 录屏为视频生成二维码
  • 企业人工智能平台 (AIaaP) 的全面解读
  • orm01
  • 深度学习:基于MindSpore NLP的数据并行训练