import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
import java.util.Scanner;
public class Main_10_a {
/**
* 砝码称重 2.0
* 动态规划
* 1.0版本 缺点:dp[N+1][A] A过大时 影响时间
* 将在2.0版本进行优化 思路:只访问当前行权值为1的元素
* 不足:考虑结果为零的情况
*/
@SuppressWarnings("all")
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int N=scan.nextInt();
int arr[]=new int[N];
int dp[][]=new int[N+1][100000];
int j1=0;
//set储存砝码组合的值 其长度表示最终结果
HashSet<Integer> set = new HashSet<>();
//list储存当前行 权值为1的元素
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < N; i++) {
arr[i]=scan.nextInt();
set.add(arr[i]);
}
scan.close();
//对dp进行初始化(√)
for (int i = 1; i < dp.length; i++) {
dp[i][arr[i-1]]=1;
}
// for (int i = 0; i < dp.length; i++) {
// for (int j = 0; j < dp[i].length; j++) {
// System.out.print(dp[i][j]);
// }
// System.out.println("\r\n");
// }
//动态转移方程
for (int i = 1; i <=dp.length-1 ; i++) {
for (int j = 1; j <dp[i].length ; j++) {
if (dp[i-1][j]==1){
dp[i][j]=1;
dp[i][j+arr[i-1]]=1;
set.add(j+arr[i-1]);
j1=Math.abs(j-arr[i-1]);
if (j1==0){
continue;
}
else{
dp[i][j1]=1;
set.add(j1);
//set.remove(0);
}
}
}
}
System.out.println(set.size());
//System.out.println(set);
}
}
【蓝桥杯】砝码称重 Java
最新推荐文章于 2023-03-22 19:16:44 发布