0
点赞
收藏
分享

微信扫一扫

蓝桥杯 试题 算法提高 砝码称重(dp)

言午栩 2022-04-08 阅读 60
java算法

题目链接
在这里插入图片描述
独立思考出来的dp,很开心,不过,也说明,这个dp很简单。
dp[i]代表表示质量i需要的最小砝码数量,如果有质量为i的砝码,显然dp[i]等于1,否则先设为0x3f3f3f3f, 然后更新状态。
dp[i]可以由所有能相加出质量i的组合转移过来,dp[i]就是从这些组合中选择砝码数量最少的。

import java.util.*;
public class Main{
	public static void main(String[] Args) {
		Scanner sc=new Scanner(System.in);
		int N,M;
		N=sc.nextInt();
		M=sc.nextInt();
		//Set<Integer> s=new HashSet<Integer>();
		int[] dp=new int[1001];
		Arrays.fill(dp, 0x3f3f3f3f);//一开始都无法表示
		//初始化dp数组,砝码本身一个就可以表示
		for(int i=0;i<N;i++) {
			int tmp=sc.nextInt();
			dp[tmp]=1;
		}
		for(int i=1;i<=M;i++) {
			//dp[i]是min能组合出他的dp[i-j]+dp[j]
			for(int j=1;j<=i/2;j++) {
				dp[i]=Math.min(dp[i], dp[i-j]+dp[j]);
			}
			
		}
		if(dp[M]==0x3f3f3f3f) {
			System.out.print("impossible");
		}else {
			System.out.print(dp[M]);
		}
		
	}
}
举报

相关推荐

0 条评论