落谷P2347_砝码称重
入门动态规划
核心就是,遍历出每一种砝码的每一个重量,然后去找当前"合法重量"数组,如果找到”合法重量“
那么"合法重量"+"当前砝码的重量"=“合法数组中新的合法重量”
因为重量为零也算"合法重量",所以初始化dp[0]=1,但最后统计时题目要求排除重量为0的情况,所以不算dp[0]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class P2347_砝码称重 {
//储存当前重量下是否成立
static int[] dp=new int[1010];
//储存每种砝码有几个
static int[] ms=new int[7];
//每种砝码的重量 从1开始
static int[] wg={0,1,2,3,5,10,20};
//总共有多少中重量的表达方式
static int sum;
static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static int nexInt() throws IOException { in.nextToken();return (int)in.nval; }
public static void main(String[] args) throws IOException {
dp[0]=1;//初始化为1,重量为0时也有一种
//循环每一个种砝码
for (int i = 1; i <=6; i++) {
ms[i]=nexInt();
//循环每一种砝码的每一个砝码
for (int j = 1; j <=ms[i]; j++) {
//从后向前找重量成立的砝码,初始只有重量为0的成立,
// 从后向前是因为,从前向后会不停的重复,导致结果是1000
for (int k = 1009; k>=0; k--) {
//找到当前成立的重量,(成立重量+合法重量=合法解)
if(dp[k]>0){
dp[k+wg[i]]=1;
}
}
}
}
//遍历合法重量数组 统计所有合法的解
for (int i = 1; i <=1009; i++) {
sum+=dp[i];
}
System.out.println("Total="+sum);
}
}