其他分享
首页 > 其他分享> > 蓝桥杯真题 砝码称重

蓝桥杯真题 砝码称重

作者:互联网

问题描述

 

 

考点

动态规划

思路

动态规划题

从第一个砝码开始,每个状态列举出当前砝码个数能够称出的重量,

每加入一个新的砝码,遍历已经能够称出的重量,将他们与新的砝码进行组合,更新能称出的重量即可。

每次更新的目标:

 代码

 1 package demo;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6     public static int[][] dp = new int[101][100001];
 7     public static int[] a = new int[101];
 8 
 9     public static void main(String args[]) {
10         Scanner in = new Scanner(System.in);
11         int n = in.nextInt();
12         int sum = 0;
13         for (int i = 0; i < n; i++) {
14             a[i] = in.nextInt();
15             sum += a[i];
16         }
17         dp[0][a[0]] = 1; // 第一个砝码的重量一定能被称出来
18         int x;
19         for (int i = 1; i < n; i++) {
20             x = a[i];// 新取一个砝码
21             for (int j = 1; j <= sum; j++)
22                 dp[i][j] = dp[i - 1][j];// 复制上一组的状态
23             dp[i][x] = 1;// 当前砝码一定可以被称出来
24             for (int j = 1; j <= sum; j++) {
25                 if (dp[i - 1][j] == 1) {
26                     // 如果上一个状态能量出来这个重量,那就更新新的重量
27                     dp[i][j + x] = 1;
28                     dp[i][Math.abs(j - x)] = 1;
29                 }
30             }
31         }
32         long ans = 0;
33         for (int i = 1; i <= sum; i++) {
34             if (dp[n - 1][i] == 1)
35                 ans++;
36         }
37         System.out.println(ans);
38     }
39 }

 

标签:能称,真题,int,重量,蓝桥,砝码,public,dp,称重
来源: https://www.cnblogs.com/JaineCC/p/16110059.html