动态规划解决整数划分的问题

原创 2015年07月08日 01:00:34
前几天去华为做机试,遇到一个整数划分的问题,题目是:现有1,2,5,10,20,50,100 元这几种钱币,问给定n元能有多少种分配方式。例如n=4时,有1+1+1+1  ,1+2+1 , 2+2 三种划分。我解决这道题是从网上看的方法,用的递归,但是悲剧的是测试用例运行超时,结果题没做出来,我直觉上觉得用动态划分可以解决,所以就研究了动态划分的解法。

首先,先找出划分,每种组合以最大面值等于多少就形成一个划分:
例如:现在这道题,有 1 , 2 , 5 ,10 ,20 ,50 , 100这7种划分,每种划分的定义是,m划分代表,在这些钱币中,最大的钱币为m。

找出划分后再找出递推公式,这个递推公式在网上找,一大堆,但是针对这个问题的递推公式为:
        n代表钱数,m代表划分数
        1. 当n==1或者是m==1时,q(n , m)=1;
        2. 当n==m时,q(n ,  m)=q(n,m-1)
        3. 当n<m时,q (n , m)=q(n,n)
        4. 当n>m时,q(n , m)= q(n ,m-1)+q(n-m,m)i

然后找出初始条件,初始条件就是当n==0,时,所有划分都等于0,所以再二维数组的第一行都为0,二维数组,行代表你的钱数,列数代表的划分数,这些划分的值在一个一维数组中存着,所以二维数组的列代表,上面一维数组的索引。还有就是当1划分的时候,所有值都等于1(二维数组的值就是拆分的个数)。

然后就按照上面的递推公式来填充二维数组,最后返回你钱数的最大划分就是最终结果,我是根据01背包问题研究的这道题,如有不懂请参见经典的01背包问题,如写的不好,请大家多批评,下面是我的代码:直接可以运行出结果

package com.test;

public class Main {

static int[] qian=new int[]{1,2,5,10,20,50,100};

public static int get(int money){
int[][] test=new int[money+1][7];
for(int i=0;i<test.length;i++){
if(i==0){
for(int j=0;j<qian.length;j++){
test[i][j]=0;
}
}else{
for(int j=0;j<qian.length;j++){
if(qian[j]==1){
test[i][j]=1;
}else{
if(i<qian[j]){
test[i][j]=test[i][j-1];

}else if(i==qian[j]){
test[i][j]=test[i][j-1]+1;
}else if(i>qian[j]){
test[i][j]=test[i-qian[j]][j]+test[i][j-1];
}
}
}
}
}
for(int i=0;i<=money;i++){
for(int j=0;j<qian.length;j++){
System.out.print(test[i][j]+" ");
}
System.out.println();
}
return test[money][qian.length-1];
}
public static void main(String[] args) {
System.out.println(get(250));

}

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

整数分划问题和钱的组合问题(动态规划)

问题1:整数分划问题 问题描述:对于一个正整数n的分划,就是把n表示成一系列正整数之和的表达式。需要注意的是,分划与顺序无关,例如6=5+1和6=1+5被认为是同一种分划。另外,这个整数n本身也算是一...

整数划分问题的动态规划算法

因为整数划分问题满足最优子结构和子问题重叠特征,故可以用动态规划算法来解。 分别使用了自顶向下的备忘录算法和自底向上动态规划算法,并且给出了一个优化算法。...

整数划分总结(动态规划)

先引入一个比较实际的问题:分苹果 题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。 1...

【动态规划/背包】整数划分的5种情况

1.将n划分成若干正整数之和的划分数(可以存在相同整数)。 转移方程如下: dp[n][m]=dp[n][m-1]+ dp[n-m][m]  dp[n][m]表示整数 n 的划分中,每个数不大于 ...

整数划分问题(动态规划)

TIPS:找到一篇讲解的很详细的博文,地址:点击打开链接 1.NYOJ 571: 整数划分(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 整...

整数划分问题---动态规划、递归

第一: 将一个整数 n 划分为 不超过m 组 的划分数 如  n=4 m=3 输出: 4 { 1+1+2=1+3=2+2=4} 思路:使用动态规划: 定义状态: dp[i][j] j的i划...

nyoj-90 整数划分 (动态规划)

整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,  其中n1≥n2≥…≥n...

整数划分问题解法2-动态规划

整数划分 --- 一个老生长谈的问题:   1) 练练组合数学能力.   2) 练练递归思想   3) 练练DP   总之是一道经典的不能再经典的题目:   这道好题求:   1. 将n划...

OJ 7219 复杂的整数划分问题__动态规划

描述将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 正整数n 的这种表示称为正整数n 的划分。输入标准的输入包含若干组测试数据。...
  • tp7309
  • tp7309
  • 2017年02月05日 12:13
  • 565

动态规划——整数划分

题目描述 Description 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划解决整数划分的问题
举报原因:
原因补充:

(最多只允许输入30个字)