1. 程式人生 > >動態規劃演算法和c++實現 國王與金礦問題

動態規劃演算法和c++實現 國王與金礦問題

這個連結講解動態規劃通俗易懂:https://blog.csdn.net/baidu_37107022/article/details/73188963

https://blog.csdn.net/baidu_37107022/article/details/73189125

動態規劃:動態規劃主要考慮到了全域性最優解,第i個解與第1~i-1個解都有關

求解動態規劃的過程必須考慮三個問題:1.狀態轉移(就是上一個狀態怎麼轉移到下一個狀態) 2.邊界值  3.最優子結構

而貪心演算法則是當前最優解,當前的狀態只與前一個狀態有關。

// ConsoleApplication5.cpp: 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
//金礦數N 
//工人數W
//黃金數 G[]
//金礦用人數p[]

int max(int a, int b)
{
    return (a > b ? a : b);
}
int getMaxValue(int p[5], int n, int w, int G[5])
{
    
    int *preResult= new int[10];//前面一行的數值
    int *Result = new int[10];
    //填充第一行的數字和邊緣的數字0
    for (int i = 0; i <n; i++)
    {
        if (i+1 < p[0])
        {
            preResult[i] = 0;
        }
        else
        {
            preResult[i] = G[0];
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <w; j++)
        {
        
            if (j < p[i])//工人數小於需要挖此礦的工人
            {
                Result[j] = preResult[j];
            }
            else
            {
                Result[j] = max(preResult[j],preResult[j-p[i]]+G[i]);
            }
            
        }
        for (int i = 0; i < w; i++)
        {
            cout << Result[i]<<" ";
            preResult[i] = Result[i];//計算完一行計算下一行 結果變成上一行的結果
            //cout << preResult[i];
        }
        cout << endl;
        
    }
    return Result[w-1];
}

int main()
{
    int p[5] = { 5,5,3,4,3 };
    int Result;
    int n = 5;
    int w = 10;
    int G[5] ={400,500,200,300,350};
    Result =getMaxValue(p, n, w, G);
    cout << Result;
    system("pause");
}

2.

// ConsoleApplication6.cpp: 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int maxVolume(int n)
{
    if (n < 2)
    {
        return 0;
    }
    if (n == 2)
    {
        return 1;
    }
    if (n == 3)
    {
        return 2;
    }
    int Volume;
    int h[50] = { 0 };
    h[1] = 1;
    h[2] = 2;
    h[3] = 3;
    for (int i = 4; i < n + 1; i++)
    {
        int max = 0;
        for (int j = 1; j < (i + 1) / 2; j++)
        {
            int Volume = h[j] * h[i-j];
            if (max < Volume)
            {
                max = Volume;
            }    
        }
        h[i] = max;
    }
    return h[n];
   
}
int main()
{
    int n = 8;
    int max=maxVolume(n);
    cout << max;
    system("pause");
}

3.

// ConsoleApplication7.cpp: 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
int function(int n)
{
    if (n == 1)
    {
        return 1;
    }
    if (n == 2)
    {
        return 2;
    }
    if (n == 3)
    {
        return 1;
    }
    if (n == 4)
    {
        return 2;
    }
    if (n == 5)
    {
        return 1;
    }
    int h[3] = { 1,3,5 };
    int Mincount = n;
    int count = 0;
    for (int i = 0; i < 3; i++)
    {
        count = function(n - h[i]) + 1;
        if(count < Mincount)
        {
            Mincount = count;
        }
    }
    return Mincount;
}

int main()
{
    int n = function(11);
    cout << n;
    system("pause");
    return 0;
}

相關推薦

動態規劃演算法c++實現 國王金礦問題

這個連結講解動態規劃通俗易懂:https://blog.csdn.net/baidu_37107022/article/details/73188963 https://blog.csdn.net/baidu_37107022/article/details/7318912

一元多項式相加的演算法C++實現

利用順序表的鏈式儲存實現一元多項式的加法 一、資料結構 <span style="font-size:18px;">struct PolyNode { float coef; //多項式的係數 int expn; //多項式的指數 PolyNod

C++記憶化搜尋演算法動態規劃演算法之公共子序列

公共子序列 Description 我們稱序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列當且僅當存在 嚴格上

C++動態規劃演算法之Maximum sum(最大)

Maximum sum(最大和) Description Given a set of n integers: A={a1, a2,..., an}, we define a function d

演算法C++實現動態規劃中的幾個典型問題

動態規劃的思想在程式設計中佔有相當的分量,動態規劃的主要思想就是把大問題劃分為小問題,通過求解小問題來逐漸解決大問題。 滿足動態規劃思想的問題具備兩個典型特徵: 最優子結構:就是說區域性的最優解能

貪心演算法,遞迴演算法動態規劃演算法比較總結

一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分

利用動態規劃演算法解01揹包問題->二維陣列傳參->cpp記憶體管理->堆棧的區別->常見的記憶體錯誤及其對策->指標陣列的區別->32位系統是4G

1、利用動態規劃演算法解01揹包問題 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 兩層for迴圈,依次考察當前石塊是否能放入揹包。如果能,則考察放入該石塊是否會得到當前揹包尺寸的最優解。 // 01 knap

Leetcode初級演算法 打家劫舍(動態規劃)(Python實現

問題描述: 演算法思想: 該問題的內在邏輯結構依然是動態規劃裡的經典結構。最關鍵的是推出狀態轉移方程,當前規模的對應解法由更低規模的解法,彷彿拾級而上,站在前人的肩膀上不斷攀登。 實際操作起來,比較實用的方法如下:固定一個比較小的規模n, 進行思維實驗。 例子:

自然語言處理(NLP)- HMM+VITERBI演算法實現詞性標註(解碼問題)(動態規劃)(Python實現

NLP- HMM+維特比演算法進行詞性標註(Python實現)     維特比演算法針對HMM解碼問題,即解碼或者預測問題(下面的第二個問題),尋找最可能的隱藏狀態序列:對於一個特殊的隱馬爾可夫模型(HMM)及一個相應的觀察序列,找到生成此序列最可能的隱藏狀態序列。也就是說

資料結構演算法——最短路徑Dijkstra演算法C++實現

#ifndef GRAPH_H #define GRAPH_H #include <list> #include <iostream> #include <vector> #include <stdlib.h> #include <string.h>

貪心演算法動態規劃演算法的異同

今天比賽硬是把貪心做成了揹包問題,氣哭口亨! 動態規劃和貪心演算法都是一種遞推演算法,均由區域性最優解來推導全域性最優解 。 貪心演算法: 不斷貪心地選取當前最優策略的演算法設計方法。 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是

PrimKruskal演算法C++實現

最近好長時間都困惑在這兩個演算法中,其實也不難,就是寫的時候比較費勁。現在總結一下。 首先說一下兩個演算法是幹嘛呢? 都是求解一個無向圖G的最小生成樹(minimum spanning tree),就是由該圖的那些連線G的所有頂點的邊構成的樹,其總值最低。這

動態規劃演算法舉例解析(最大收益最小損失選擇)

在說動態規劃的例子之前,先說明一下動態規劃和分治演算法的區別 雖然兩者都是通過組合子問題的解來求解原問題但是分治方法將問題劃分為互不相交的子問題,遞迴的求解子問題再將它們的解組合起來求出原問題的解。 而動態規劃演算法應用於子問題重疊的情況,即不同的子問題具有公共的子子問題,

貪心演算法動態規劃演算法比較

動態規劃和貪心演算法都是一種遞推演算法 均用區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1

動態聚類中 C-均值演算法 (K-均值演算法)的C++實現

一:說明 動態聚類方法是模式識別中一種普遍採用的方法,它具有以下3個要點: 1:選定某種距離度量作為樣本間的相似性度量 2:確定某個評價聚類結果質量的準則函式 3:給定某個初始分類,然後用迭代演算法找出使準則函式取極值的最好的聚類結果 本文給出了 C-均值演算法 的 C++實

基於OpenCVC++實現最大閾值分割演算法

程式碼如下:: /********************************************************************************************************** *檔案說明: * 基於Ope

動態規劃演算法(連續子陣列最大,O(N)時間複雜度O(1)空間複雜度) 【更新於:2018-05-13】

這個題目最早在13年阿里筆試出現,直到前兩天面試另一家電商又出現,哎,欠的都是要還的。 這個問題的思路如下:一維陣列的下標連續的元素構成連續子陣列,求所有連續子陣列中和最大的那個子陣列。 解析:2018-11-08 1 首先這個問題要轉化為Q(n)的問題,對於Q(n)的

動態規劃演算法(後附常見動態規劃例題及Java程式碼實現

原文連結 一、基本概念     動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 二、基本思想與策略     基本思想與分治法類似,也是

動態建立二維vector陣列 CC++ 及指標引用的區別

二維vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二維vector動態建立m*n的二維vector方法一:vector<vector <int>

演算法隨筆:動態規劃演算法實現DNA序列對齊

背景:專業寫作課的實驗專案專案背景:利用動態規劃演算法的思想實現DNA的序列最優對齊演算法思路:暫時略註明:兩小時寫兩小時調程式碼,請尊重博主原創。同一課程的看到了是不是應該加個關注,hhh。轉載請註明出處:https://blog.csdn.net/whandwho/art