一、砝码称重
1.问题引入
现有1g、2g、3g、5g、10g、20g的砝码各若干枚,问用这些砝码可以称出多少种不同的重量。(设砝码的总重量不超过1000克,且砝码只能放在天平的一端)
输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6个)
输出方式:N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
如:输入:1 1 0 0 0 0
输出:3 表示可以称出1g,2g,3g三种不同的重量。
2.思路分析
此题运用动态规划很重要的一点就是称出的质量可能会重复,所以可以做个标记,每个已经称出的重量dp[k]设为1,否则为0,由于dp[0]不存在,可以先赋值为1。
3.代码如下
<span style="color:#330099">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Scanner;
public class 砝码称重 {
public static void main(String[] args) throws IOException{
int m[]={1,2,3,5,10,20};//砝码
int a[]=new int[m.length];//个数
int total=0;
int max=1000;//假设可以称出的最大质量为1000
int dp[]=new int[max+1];
for(int i=0;i<dp.length;i++) dp[i]=0;
dp[0]=1;
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
String s=buf.readLine();
String s1[]=s.split(" ");
for(int i=0;i<m.length;i++)
a[i]=Integer.parseInt(s1[i]);
for(int i=0;i<m.length;i++){
for(int j=0;j<a[i];j++){
for(int k=max;k>=m[i];k--)
if(dp[k-m[i]]==1 && dp[k]==0){
dp[k]=1;
total++;
}
}
}
System.out.print(total);
}
}</span>