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

      动态规划问题,主要在于需要想清楚递推关系,num[i][j]表示能使用 i 种硬币时,得到 j 零钱的最优解。

      想来就是首先假设只能使用第一种硬币 1 ,那么会得到num[ 1 : n] = {1,2,3,4.....n},然后在此基础上,我们引入第二种硬币 2 ,考虑num[i][j],此时存在两种情况,即加入硬币是否使得硬币个数减少,答案是肯定的。当然要先判断2能放入多少个,这里设为k个,然后递归求值。

    // Study.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include <unordered_map>
    #include <unordered_set>
    #include <queue>
    #include <string>
    #include <algorithm>
    #include <sstream>
    #include <set>
    #include <stack>
    #define INT_MAX 2147483647 // maximum (signed) int value
    #define INT_MIN (-2147483647 - 1) // minimum (signed) int value
    ;
    #define Min(x,y) (x)<(y)?(x):(y)
    
    using namespace std;
    
    int Max(int a, int b)
    {
    return a > b ? a : b;
    }
    
    void coin_solution(int m, vector<int> &value)
    {
    int n = value.size()-1;
    vector<vector<int>> num(n + 1, vector<int>(m+1,INT_MAX));
    
    //for (int j = 1; j <= m; j++)
    //	if (num[1][j] % value[1] == 0)
    //	num[1][j] = j / value[1];
    
    for (int i = 0; i <= n; i++)
    num[i][0] = 0;
    
    for (int i = 1; i <= n; i++)
    {
    for (int j = 1; j <= m; j++)
    {
    if(value[i] <= j)
    for (int k = 1; k <= j / value[i]; k++)
    num[i][j] = Min(num[i - 1][j], num[i - 1][j - k * value[i]] + k);
    
    else 
    num[i][j] = num[i - 1][j];
    }
    }
    
    for (int i = 1; i <= n; i++)
    {
    for (int j = 1; j <= m; j++)
    if (num[i][j] == INT_MAX)
    cout << -1 << " ";
    else 
    cout << num[i][j] << " ";
    cout << endl;
    }
    
    if (num[n][m] != INT_MAX)
    cout << num[n][m] << endl;
    else
    cout << -1 << endl;
    }
    
    int main()
    {
    int M = 65;
    vector<int> value = {0,1,2,5,21,25};
    
    coin_solution(M,value);
    
    system("pause");
    return 0;
    }
    
     
    

      

  • 相关阅读:
    [C#网络编程系列]专题一:网络协议简介
    也谈校园应用微同济的用户体验
    iOS 富文本类库RTLabel
    遥控三通直升机飞行原理简介
    A Distributed Algorithm Exercise
    在Ubantu 下下载代码 android源码 2
    新手模拟器训练指南(固定翼版)
    datasnap 2010 利用心跳包清除TCP死连接
    datasnap 2011 连接池
    datasnap 2010 利用JSON序列化和反序列化任何类型的对象
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9400382.html
Copyright © 2011-2022 走看看