【蓝桥杯】历届真题 砝码称重(省赛)Java
创始人
2024-05-13 05:10:30
0

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

        你有一架天平和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,N个砝码总重不超过100000。

思路与分析

        该题初看没什么头绪,但仔细读题并结合数据结构的相关知识便可以发现制胜之道。利用该题所给的题例,我自然而然的联想到了——动态规划法。

        而动态规划法解题的关键是什么?对,状态转移方程。只需要根据所给题例解析出背后的“规律”,也就是方程即可。

        理清思路,开始解题。
        首先,我们要明确砝码有几种状态【w:重量首字母】

                1、放在左边:arr[i][j] = arr[i-1][j-w[i]] (前i-1个砝码是否能称出j-当前砝码重量   j)

                2、放在右边:arr[i][j] = arr[i-1][j+w[i]](前i-1个砝码是否能称出j+当前砝码重量  j)

                3、不进行放置:arr[i][j] = arr[i-1][j]    (前i-1个砝码是否能称出重量  j)

        由上述式子可得状态转移方程如下:

                arr[i][j] = arr[i-1][j-w[i]] || arr[i][j] = arr[i-1][j+w[i]]  || arr[i][j] = arr[i-1][j]

        不难发现,该式子要想使得 arr[i-1][j-w[i]] 为 true,首先要让arr[0][0] 及 arr[i][0] 为 true,这样在 j-w[i]=0 时,arr[i-1][j-w[i]] 才能为 true。

代码

import java.util.Scanner;public class Main {public static void main(String[] args) {//arr[i][j]表示前i个砝码是否能称出重量jboolean[][] arr = new boolean[102][100003];    //100003 3代表3种状态Scanner sc = new Scanner(System.in);int num = sc.nextInt();int[] w = new int[102];     //该数组用于存放各个砝码的重量int sum = 0;                //砝码数量和for (int i=1;i<=num;i++){w[i] = sc.nextInt();sum += w[i];}arr[0][0] = true;      //arr[0][0]的值为true,意为帮助arr[i][j]计算for (int i=1;i<=n;i++){for (int j=0;j<=sum;j++){   //arr[i][0]的值也必须为0arr[i][j] = arr[i-1][j]||arr[i-1][Math.abs(j-w[i])]||arr[i-1][Math.abs(j+w[i])];}}int res = 0;    //存储结果数for (int j=1;j<=sum;j++){   if (arr[num][j])    //能测到这个重量res++;    //结果++}System.out.println(res);}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...