您的位置:首页 > 其它

常考经典算法---动态规划(拼凑面额、背包问题)

2017-09-09 11:40 1426 查看
<1>拼凑面额

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N员(N为0-10000的非负整数)的不同组合的个数。 

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。

示例1

输入

5

输出

2

链接:https://www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93

来源:牛客网

链接:https://www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93

来源:牛客网

一个典型的dp问题,参照了大神的思路加上百度dp思想,总结一下:
1.dp概念:简单来说就是将原来的问题分解成多个子问题,然后将子问题一个一个的解决,最终问题的规模变小了;
2.本题可以使用dp的思想来做,合成一个面值为n的组合数,可以看成合成n-1,n-5,n-10,n-20,n-50,n-100五个面值的组合数之和,然后将问题细分化,最终可以求出结果,其中我们知道,面值为1的组合数为1

贴代码:

链接:https://www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93
来源:牛客网

import java.util.Scanner;
 
public class StringUtil {
 
    //拼凑面额
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arr[] = {1,5,10,20,50,100};
        while(in.hasNext()){
            int n = in.nextInt();
            long res[] = new long[n+1];
            res[0] = 1L;
             
            for(int i=0; i<arr.length; i++){
                for(int j=1; j<=n; j++){
                    if(j >= arr[i]){
                        res[j] += res[j-arr[i]];
                    }
                }
            }
             
            System.out.println(res
);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: