码迷,mamicode.com
首页 > 其他好文 > 详细

找零 动态规划

时间:2014-05-09 07:35:57      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

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

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

这是dfs暴力搜索

下面是未优化的dp代码

bubuko.com,布布扣
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;
}
bubuko.com,布布扣

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

参考:

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

找零 动态规划,布布扣,bubuko.com

找零 动态规划

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/lailailai/p/3717946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!