动态规划----计数问题
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);
}
}
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);
}
}
相关文章推荐
- AC解 - 用动态规划解决一道排列组合计数问题(序关系计算)
- 动态规划第四讲——计数问题中的DP算法
- HDU 3555 浅谈数位动态规划逆向计数问题练习
- 一道组合数问题--出自 曹钦翔_wc2012组合计数与动态规划
- 算法_动态规划_序关系计数问题
- poj 1742 Coins (动态规划,背包问题)
- 计数问题-分治
- 动态规划之 0-1背包问题及改进
- 动态规划——数塔问题
- 动态规划 - 矩阵连乘问题(笔记)
- 九度OJ 1532 棋盘寻宝扩展 -- 动态规划【背包问题】
- c++实现0-1背包问题完整源码(动态规划实现)
- 01背包问题---动态规划详解
- SSAS GUID 添加 行计数,非重复计数 等 遇到的莫名其妙的问题
- 动态规划,背包问题,卡题(CRB and His Birthday,HDU 5410)
- 多阶段决策过程的最优化问题(动态规划)
- 【动态规划】poj2773采药问题
- 数据结构(C#)--利用动态规划解决0-1背包问题
- 多段资源分配问题(动态规划)
- 动态规划_矩阵连乘问题