题目链接
独立思考出来的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]);
}
}
}