国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

寫(xiě)在前面

由于本人實(shí)力尚淺,接觸算法沒(méi)多久,寫(xiě)這篇blog僅僅是想要提升自己對(duì)算法的理解,如果各位讀者發(fā)現(xiàn)什么錯(cuò)誤,懇請(qǐng)指正,希望和大家一起進(jìn)步。(●’?’●)

完全背包問(wèn)題

了解完全背包問(wèn)題前可以先去看看01背包問(wèn)題(良心正解),先了解這個(gè)基礎(chǔ)問(wèn)題會(huì)更有利于你了解下面的完全背包問(wèn)題(個(gè)人觀點(diǎn))

題目

動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題,數(shù)據(jù)結(jié)構(gòu)與算法,# 動(dòng)態(tài)規(guī)劃,動(dòng)態(tài)規(guī)劃,算法,c++,數(shù)據(jù)結(jié)構(gòu)

思路

重要變量說(shuō)明:
f[][[]:用于狀態(tài)表示;
w[]:記錄每個(gè)物品的價(jià)值;
v[]:記錄每個(gè)物品的體積

  1. 定義二維數(shù)組f[][],其中f[i][j]表示在前i個(gè)物品,背包容積為j的限制下所能裝下的最大價(jià)值。這里的f[i][j]就是做法的集合,f[i][j]的值就是最大價(jià)值即屬性。
  2. i=1開(kāi)始枚舉,對(duì)于第i個(gè)物品,都有無(wú)數(shù)種選擇(看似是無(wú)數(shù)種,其實(shí)還是有限制的):
    • 如果不選第i個(gè)物品,那么狀態(tài)轉(zhuǎn)移方程為f[i][j]=f[i-1][j]
    • 如果選擇第i個(gè)物品一次,那么狀態(tài)轉(zhuǎn)移方程為f[i][j]=f[i-1][j-v[i]]+w[i]
    • 如果選擇第i個(gè)物品二次,那么狀態(tài)轉(zhuǎn)移方程為f[i][j]=f[i-1][j-2*v[i]]+2*w[i]
    • ......
    • 如果選擇第i個(gè)物品k次,那么狀態(tài)轉(zhuǎn)移方程為f[i][j]=f[i-1][j-k*v[i]]+k*w[i]
  3. 我們因?yàn)橐笞畲髢r(jià)值,所以對(duì)上面兩種情況去max即可

我們發(fā)現(xiàn)其實(shí)上面的思路大致上和01背包問(wèn)題差不多,只不過(guò)對(duì)于每一個(gè)物品i,我們不止兩種選擇(選與不選)而是有無(wú)數(shù)種選擇。所以我們可以在01背包問(wèn)題的基礎(chǔ)上,在兩層循環(huán)中再套一層循環(huán),表示選擇第i個(gè)物品多少次。

代碼(不優(yōu)化版,二維數(shù)組)

#include<iostream>

using namespace std;
const int N=1010;
int f[N][N],v[N],w[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i],&w[i]);
    for(int i=1;i<=n;i++)       //i表示當(dāng)前選擇到第i個(gè)物品,我們從第1個(gè)物品開(kāi)始枚舉,一直到n個(gè)物品
        for(int j=1;j<=m;j++)       //j表示當(dāng)前背包的容積,我們從1開(kāi)始枚舉,一直到背包的最大的容積
            for(int k=0;k<=j/v[i];k++)      //k表示當(dāng)前的選擇第i個(gè)物品的次數(shù),一直到所能選擇的最大次數(shù)
                f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
    printf("%d\n",f[n][m]);
    return 0;
}

優(yōu)化1(降低時(shí)間復(fù)雜度)

我們可以看到上面的思路雖然可以求解問(wèn)題,但是時(shí)間復(fù)雜度是 O ( l o g 2 n ) O(log_2n) O(log2?n),而題目給出的數(shù)據(jù)是 1 0 3 10^3 103,那么最后就是 1 0 9 10^9 109,而我們的要求是1s內(nèi),大概是 1 0 7 ? 1 0 8 10^7-10^8 107?108之間,所以我們還要優(yōu)化

思路
f[i , j ] = max( f[i-1,j] , f[i-1,j-v]+w ,  f[i-1,j-2*v]+2*w , f[i-1,j-3*v]+3*w , .....)
f[i , j-v]= max(            f[i-1,j-v]   ,  f[i-1,j-2*v] + w , f[i-1,j-3*v]+2*w , .....)
由上兩式,可得出如下遞推關(guān)系: 
                        f[i][j]=max(f[i,j-v]+w , f[i-1][j]) 

還是沒(méi)看懂的寶寶們可以可以看下面這份詳細(xì)推理
動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題,數(shù)據(jù)結(jié)構(gòu)與算法,# 動(dòng)態(tài)規(guī)劃,動(dòng)態(tài)規(guī)劃,算法,c++,數(shù)據(jù)結(jié)構(gòu)

代碼
#include<iostream>

using namespace std;
const int N=1010;
int f[N][N],v[N],w[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i],&w[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            {
                if(j>=v[i])
                    f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
                else
                    f[i][j]=f[i-1][j];
            }
    printf("%d\n",f[n][m]);
    return 0;
}

思考

我們把完全背包問(wèn)題和01背包問(wèn)題做一下對(duì)比
01背包問(wèn)題:f[i][j] = max(f[i][j],f[i-1][j-v[i]]+w[i]);
完全背包問(wèn)題: f[i][j] = max(f[i][j],f[i][j-v[i]]+w[i]);
于是乎,聰明的你一定想到了完全背包問(wèn)題的代碼還可以?xún)?yōu)化,只使用一維數(shù)組,降低空間復(fù)雜度

優(yōu)化2(降低空間復(fù)雜度)

具體為什么可以只用一維數(shù)組請(qǐng)看01背包問(wèn)題

代碼
#include<iostream>

using namespace std;
const int N=1010;
int f[N],v[N],w[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i],&w[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            {
                if(j>=v[i])
                    f[j]=max(f[j],f[j-v[i]]+w[i]);
                else
                    f[j]=f[j];
            }
    printf("%d\n",f[m]);
    return 0;
}

再思考

Q:為什么01背包問(wèn)題使用一維數(shù)組時(shí),枚舉背包空間時(shí)要逆序,而完全背包問(wèn)題使用一維數(shù)組時(shí),枚舉背包空間時(shí)是正序?
A:01背包問(wèn)題中我們每次更新用的都應(yīng)該是上一層即i-1層的數(shù)據(jù),但是如果正序枚舉背包空間j的話(huà),在更新較大容積時(shí),用到的就是已經(jīng)污染的數(shù)據(jù),即在第i層時(shí),可能在j=v[i]時(shí)選了i這個(gè)物品,當(dāng)j=2*v[i]時(shí)我們可能又選了i這個(gè)物品,而第i這個(gè)物品只能被選一次,而逆序枚舉時(shí),每次都只可能選擇第i這個(gè)物品一次。但是在完全背包問(wèn)題中我們就要用正序,因?yàn)槲覀円木褪且呀?jīng)更新的數(shù)據(jù),因?yàn)槊總€(gè)物品都有無(wú)數(shù)個(gè),所以可以選擇第i個(gè)物品多次

如果你覺(jué)得我寫(xiě)題解還不錯(cuò)的,請(qǐng)各位王子公主移步到我的其他題解看看
數(shù)據(jù)結(jié)構(gòu)與算法部分(還在更新中):
C++ STL總結(jié) - 基于算法競(jìng)賽(強(qiáng)力推薦
最短路算法——Dijkstra(C++實(shí)現(xiàn))
最短路算法———Bellman_Ford算法(C++實(shí)現(xiàn))
最短路算法———SPFA算法(C++實(shí)現(xiàn))
最小生成樹(shù)算法———prim算法(C++實(shí)現(xiàn))
最小生成樹(shù)算法———Kruskal算法(C++實(shí)現(xiàn))
染色法判斷二分圖(C++實(shí)現(xiàn))
動(dòng)態(tài)規(guī)劃——01背包問(wèn)題
Linux部分(還在更新中):
Linux學(xué)習(xí)之初識(shí)Linux
Linux學(xué)習(xí)之命令行基礎(chǔ)操作

???總結(jié)

“種一顆樹(shù)最好的是十年前,其次就是現(xiàn)在”
所以,
“讓我們一起努力吧,去奔赴更高更遠(yuǎn)的山?!?br>動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題,數(shù)據(jù)結(jié)構(gòu)與算法,# 動(dòng)態(tài)規(guī)劃,動(dòng)態(tài)規(guī)劃,算法,c++,數(shù)據(jù)結(jié)構(gòu)
如果有錯(cuò)誤?,歡迎指正喲??

??如果覺(jué)得收獲滿(mǎn)滿(mǎn),可以動(dòng)動(dòng)小手,點(diǎn)點(diǎn)贊??,支持一下喲??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762112.html

到了這里,關(guān)于動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 動(dòng)態(tài)規(guī)劃-背包問(wèn)題-完全背包

    對(duì)比01背包,完全背包中的每件物品有無(wú)數(shù)件。 也就是說(shuō),每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i種物品,體積為j時(shí)的最大價(jià)值 對(duì)于第i件物品: 不拿:dp[i][j]?dp[i-1][j] 拿一件:dp[i][j]?dp[i-1][j-w[i]]+v[i] 拿兩件:dp[i][j]?dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]?dp[i

    2024年04月08日
    瀏覽(20)
  • 完全背包&多重背包問(wèn)題(動(dòng)態(tài)規(guī)劃)

    完全背包問(wèn)題: 每個(gè)物品使用次數(shù)沒(méi)有限制,與0-1背包的不同之處在于 遍歷背包的順序 是正序。 多重背包問(wèn)題: 與完全背包的區(qū)別在于,每一種物品是有個(gè)數(shù)限制的,不能無(wú)限選擇。這篇博客講解的非常詳細(xì),可以參考學(xué)習(xí): 多重背包問(wèn)題---超詳細(xì)講解+優(yōu)化(不懂你揍我

    2024年04月10日
    瀏覽(24)
  • 動(dòng)態(tài)規(guī)劃之背包問(wèn)題——完全背包

    算法相關(guān)數(shù)據(jù)結(jié)構(gòu)總結(jié): 序號(hào) 數(shù)據(jù)結(jié)構(gòu) 文章 1 動(dòng)態(tài)規(guī)劃 動(dòng)態(tài)規(guī)劃之背包問(wèn)題——01背包 動(dòng)態(tài)規(guī)劃之背包問(wèn)題——完全背包 動(dòng)態(tài)規(guī)劃之打家劫舍系列問(wèn)題 動(dòng)態(tài)規(guī)劃之股票買(mǎi)賣(mài)系列問(wèn)題 動(dòng)態(tài)規(guī)劃之子序列問(wèn)題 算法(Java)——?jiǎng)討B(tài)規(guī)劃 2 數(shù)組 算法分析之?dāng)?shù)組問(wèn)題 3 鏈表 算法

    2024年02月03日
    瀏覽(27)
  • 【動(dòng)態(tài)規(guī)劃之完全背包問(wèn)題】完全背包問(wèn)題的通用解法與優(yōu)化

    【動(dòng)態(tài)規(guī)劃之完全背包問(wèn)題】完全背包問(wèn)題的通用解法與優(yōu)化

    ?? 前面的話(huà) ?? 本篇文章將介紹動(dòng)態(tài)規(guī)劃中的背包問(wèn)題——完全背包問(wèn)題,前面我們已經(jīng)介紹了0-1背包問(wèn)題,其實(shí)完全背包問(wèn)題就只改了0-1背包問(wèn)題的一個(gè)條件,即物品可選擇次數(shù)由一次改為無(wú)數(shù)次,僅此而已,下面我們就來(lái)開(kāi)始介紹完全背包問(wèn)題。 ??博客主頁(yè):未見(jiàn)

    2023年04月22日
    瀏覽(115)
  • 動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題

    動(dòng)態(tài)規(guī)劃——完全背包問(wèn)題

    由于本人實(shí)力尚淺,接觸算法沒(méi)多久,寫(xiě)這篇blog僅僅是想要提升自己對(duì)算法的理解,如果各位讀者發(fā)現(xiàn)什么錯(cuò)誤,懇請(qǐng)指正,希望和大家一起進(jìn)步。(●’?’●) 了解完全背包問(wèn)題前可以先去看看01背包問(wèn)題(良心正解),先了解這個(gè)基礎(chǔ)問(wèn)題會(huì)更有利于你了解下面的完全背

    2024年02月04日
    瀏覽(29)
  • 動(dòng)態(tài)規(guī)劃:完全背包問(wèn)題

    動(dòng)態(tài)規(guī)劃:完全背包問(wèn)題

    ACwing #3. 完全背包問(wèn)題 完全背包問(wèn)題和01背包問(wèn)題很相似。 01背包問(wèn)題每個(gè)物品只能選一個(gè),而完全背包問(wèn)題每個(gè)物品可以選無(wú)限次。 DP問(wèn)題的關(guān)鍵是找到狀態(tài)轉(zhuǎn)移方程: ①定義f[i][j]表示從前 i 個(gè)物品中選擇,體積為 j 的時(shí)候的最大價(jià)值。 ②那么轉(zhuǎn)移方程f[i][j] = max(f[i - 1][j

    2023年04月19日
    瀏覽(25)
  • 算法系列--動(dòng)態(tài)規(guī)劃--背包問(wèn)題(3)--完全背包介紹

    算法系列--動(dòng)態(tài)規(guī)劃--背包問(wèn)題(3)--完全背包介紹

    ??\\\"Su7\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動(dòng)態(tài)規(guī)劃–背包問(wèn)題(3)–完全背包介紹 大家好,今天為大家?guī)?lái)的是 算法系列--動(dòng)態(tài)規(guī)劃--背包問(wèn)題(3)--完全背包介紹 鏈接: 完全背包 可以發(fā)現(xiàn)完全背包問(wèn)題和01背包問(wèn)題還是特比相似的 分析: 完全背包問(wèn)題 是 01背包問(wèn)題 的推廣

    2024年04月25日
    瀏覽(28)
  • 動(dòng)態(tài)規(guī)劃完全背包問(wèn)題-java

    動(dòng)態(tài)規(guī)劃完全背包問(wèn)題-java

    完全背包問(wèn)題跟01背包問(wèn)題思路大致一樣,只不過(guò)對(duì)于物品的拿取次數(shù)不在限制,我們只需要考慮這點(diǎn)即可。 文章目錄 前言 一、什么是完全背包問(wèn)題? 二、問(wèn)題模擬 1.樣例數(shù)據(jù) 2.算法思路 三、代碼如下 1.代碼如下(示例): 2.讀入數(shù) 3.代碼運(yùn)行結(jié)果 總結(jié) 完全背包問(wèn)題跟

    2024年04月26日
    瀏覽(24)
  • 動(dòng)態(tài)規(guī)劃-----背包類(lèi)問(wèn)題(0-1背包與完全背包)詳解

    動(dòng)態(tài)規(guī)劃-----背包類(lèi)問(wèn)題(0-1背包與完全背包)詳解

    目錄 什么是背包問(wèn)題? 動(dòng)態(tài)規(guī)劃問(wèn)題的一般解決辦法: 0-1背包問(wèn)題: 0 - 1背包類(lèi)問(wèn)題? 分割等和子集:? 完全背包問(wèn)題:? 完全背包類(lèi)問(wèn)題 零錢(qián)兌換II: 背包問(wèn)題(Knapsack problem)是一種組合優(yōu)化的NP完全問(wèn)題。 問(wèn)題可以描述為:給定一組物品,每種物品都有自己的重量和價(jià)格

    2024年04月17日
    瀏覽(29)
  • 三十八、動(dòng)態(tài)規(guī)劃——背包問(wèn)題( 01 背包 + 完全背包 + 多重背包 + 分組背包 + 優(yōu)化)

    三十八、動(dòng)態(tài)規(guī)劃——背包問(wèn)題( 01 背包 + 完全背包 + 多重背包 + 分組背包 + 優(yōu)化)

    0 1 背包問(wèn)題: 條件:N 個(gè)物品容量為 V 的背包,每件物品最多用 1 次,其中物品信息體積為 Vi,價(jià)值為 Wi。 目標(biāo):選出物品,使價(jià)值最大(不一定裝滿(mǎn)背包)。 特點(diǎn):每件物品 最多只用 1 次 完全背包問(wèn)題: 特點(diǎn):每一件物品都有 無(wú)限個(gè) 多重背包問(wèn)題: 特點(diǎn):每個(gè)物品

    2024年02月07日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包