蓝桥杯真题 砝码称重
作者:互联网
问题描述
考点
动态规划
思路
动态规划题
从第一个砝码开始,每个状态列举出当前砝码个数能够称出的重量,
每加入一个新的砝码,遍历已经能够称出的重量,将他们与新的砝码进行组合,更新能称出的重量即可。
每次更新的目标:
-
新加入的砝码肯定能被称出来,只放它一个(
dp[i][x] = 1
) -
与之前能称出的重量相加而来的重量能被称出来(
dp[i][j + x] = 1
) -
与之前能称出的重量相减而来的重量能被称出来(
dp[i][Math.abs(j - x)] = 1
)
代码
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