zoukankan      html  css  js  c++  java
  • 找零 动态规划

    好久没写动态规划,中午听到学长们讨论的一道题,就是给出一组硬币面额,和一个目标数值,求有几种找零方式(想半天没想清楚)

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int count(int* s, int m, int n) {
        if (n == 0) return 1;
        if (n < 0 || m <= 0) return 0;
        return count(s, m - 1, n) + count(s, m, n-s[m-1]);
    }
    
    int main() {
        int arr[] = {1, 2, 3};
        int m = sizeof(arr) / sizeof(int);
        cout<<count(arr, m, 4)<<endl;
        system("pause");
        return 0;
    }

    这是dfs暴力搜索

    下面是未优化的dp代码

    int count_dp(int *s, int m, int n) {
        int rows = m + 1;
        int cols = n + 1;
        int* dp = new int[rows * cols];
        for (int i=0; i<cols; i++) dp[i] = 0;
        for (int i=0; i<rows; i++) dp[i * cols] = 1;
        
        for (int i=1; i<rows; i++) {
            int base = i * cols;
            for (int j=1; j<cols; j++) {
                int va = 0, vb = dp[base - cols + j];
                if (j - s[i-1] >= 0) {
                    va = dp[base + j - s[i-1]];
                }
                dp[base + j] = va + vb;
            }
        }
        
        int ret = dp[cols * rows - 1];
        delete[] dp;
        return ret;
    }

    感觉这类问题在分解为最优子问题时总是划分为某个元素取与不取,还是没什么长进

    参考:

    http://www.acmerblog.com/dp6-coin-change-4973.html

  • 相关阅读:
    Ubuntu14.04LTS系统QQ的安装:pidgin-lwqq
    Ubuntu14.04LTS系统输入法的安装
    Linux系统安装及初始化(ubuntu14.04)
    创建RAID并永久挂载RAID
    磁盘管理和磁盘配额
    用户账号组账号概述
    安装及管理程序
    目录和文件管理
    Vi编辑器的工作模式
    Linux命令及使用方法
  • 原文地址:https://www.cnblogs.com/lailailai/p/3717946.html
Copyright © 2011-2022 走看看