您的位置:首页 > 其它

动态规划----计数问题

2017-04-06 11:46 148 查看
一、砝码称重

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.代码如下

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.i
4000
n));
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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: