日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自顶向下 与自底向上解决01 背包问题

發布時間:2025/6/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自顶向下 与自底向上解决01 背包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
01背包問題具體例子:假設現有容量10kg的背包,另外有3個物品,分別為a1,a2,a3。物品a1重量為3kg,價值為4;物品a2重量為4kg,價值為5;物品a3重量為5kg,價值為6。將哪些物品放入背包可使得背包中的總價值最大?


  這個問題有兩種解法,動態規劃和貪婪算法。本文僅涉及動態規劃。


  先不套用動態規劃的具體定義,試著想,碰見這種題目,怎么解決?


  首先想到的,一般是窮舉法,一個一個地試,對于數目小的例子適用,如果容量增大,物品增多,這種方法就無用武之地了。


  其次,可以先把價值最大的物體放入,這已經是貪婪算法的雛形了。如果不添加某些特定條件,結果未必可行。


  最后,就是動態規劃的思路了。先將原始問題一般化,欲求背包能夠獲得的總價值,即欲求前i個物體放入容量為m(kg)背包的最大價值c[i][m]——使用一個數組來存儲最大價值,當m取10,i取3時,即原始問題了。而前i個物體放入容量為m(kg)的背包,又可以轉化成前(i-1)個物體放入背包的問題。下面使用數學表達式描述它們兩者之間的具體關系。


  表達式中各個符號的具體含義。


  w[i] : ?第i個物體的重量;


  p[i] : 第i個物體的價值;


  c[i][m] : 前i個物體放入容量為m的背包的最大價值;


  c[i-1][m] : 前i-1個物體放入容量為m的背包的最大價值;


  c[i-1][m-w[i]] : 前i-1個物體放入容量為m-w[i]的背包的最大價值;


  由此可得:


      c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下圖將給出更具體的解釋)






?


?


    根據上式,對物體個數及背包重量進行遞推,列出一個表格(見下表),表格來自(http://blog.csdn.net/fg2006/article/details/6766384?reload) ,當逐步推出表中每個值的大小,那個最大價值就求出來了。推導過程中,注意一點,最好逐行而非逐列開始推導,先從編號為1的那一行,推出所有c[1][m]的值,再推編號為2的那行c[2][m]的大小。這樣便于理解。






    


    思路厘清后,開始編程序,C語言代碼如下所示。


#include <stdio.h> int c[10][100]={0};void knap(int m,int n){int i,j,w[10],p[10];for(i=1;i<n+1;i++)scanf("%d,%d",&w[i],&p[i]);for(j=0;j<m+1;j++)for(i=0;i<n+1;i++){if(j<w[i]){c[i][j]=c[i-1][j];continue;}else if(c[i-1][j-w[i]]+p[i]>c[i-1][j])c[i][j]=c[i-1][j-w[i]]+p[i];elsec[i][j]=c[i-1][j];}} int main(){int m,n;int i,j;printf("input the max capacity and the number of the goods:\n");scanf("%d,%d",&m,&n);printf("Input each one(weight and value):\n");knap(m,n);printf("\n");for(i=0;i<=n;i++)for(j=0;j<=m;j++){printf("%4d",c[i][j]);if(m==j) printf("\n");} } 代碼中,紅色字體部分是自己寫的,其余的參照了這篇博客http://blog.sina.com.cn/s/blog_6dcd26b301013810.html



自頂向下

#include <stdio.h> #include <tchar.h> #include <queue> #include "iostream" using namespace std; const int N = 4; const int W = 5; int weight[N] = {2, 1, 3, 2}; int value[N] = {3, 2, 4, 2}; int record[N][W]; void init() { for(int i = 0; i < N; i ++) { for(int j = 0; j < W; j ++) { record[i][j] = -1; } } } int solve(int i, int residue) { if(-1 != record[i][residue]) return record[i][residue]; int result = 0; if(i >= N) return result; if(weight[i] > residue) { record[i + 1][residue] = solve(i+1, residue); } else { result = max(solve(i+1, residue), solve(i+1, residue-weight[i]) + value[i]); } return record[i + 1][residue] = result; } int main() { init(); int result = solve(0, W); cout << result << endl; return 0; }



總結

以上是生活随笔為你收集整理的自顶向下 与自底向上解决01 背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人在线观看免费爱爱 | 一级片久久久 | 九九热在线免费观看 | 佐山爱在线视频 | 欧美一卡二卡在线观看 | 免费人成在线观看网站 | 91黄色在线观看 | 蜜桃av成人| 美女精品久久 | 黑人vs亚洲人在线播放 | 欧美日韩一级在线观看 | 亚洲热av| 欧美成人极品 | 亚洲第一二三区 | 日本人妻不卡一区二区三区中文字幕 | 红桃视频国产精品 | 成人中文视频 | 波多野结衣办公室双飞 | 美日韩精品 | 超碰在线免费观看97 | 天天爱综合网 | 粉嫩av网址 | 夜夜爱爱| 陪读偷伦初尝小说 | 国产成人午夜高潮毛片 | 欧美特级a | 欧美综合一区二区三区 | 国产视频久久久久久 | 特种兵之深入敌后高清全集免费观看 | 天天色综网 | 亚洲操 | 亚州一区二区 | 国产高清视频一区 | av一级| av在线不卡一区 | 性久久久久久久久久 | 国产999| 精品国产乱码久久久久久久 | 黑人操日本女人视频 | 国产99久久九九精品无码免费 | 国内自拍第一页 | jizz视频在线观看 | 欧美精品在线一区 | 欧洲女同同性吃奶 | 色综合狠狠操 | 在线观看特色大片免费网站 | 日韩理论在线观看 | 波多野结衣在线一区 | 亚洲三区在线观看无套内射 | 丰满尤物白嫩啪啪少妇 | 久久久久国产精品视频 | 男女黄床上色视频免费的软件 | 自慰无码一区二区三区 | 男女做爰猛烈吃奶啪啪喷水网站 | 少妇毛片一区二区三区粉嫩av | 国产a级免费视频 | 天天在线免费视频 | 色一情一交一乱一区二区三区 | 激情五月婷婷综合网 | www.中文字幕av | 日本欧美在线观看 | 青青草视频免费观看 | 尤物视频在线 | 97精品国产97久久久久久粉红 | 高潮网址 | 欧美性色黄大片手机版 | 亚洲免费婷婷 | 狠狠躁日日躁 | 国产精品福利视频 | 强伦人妻一区二区三区 | 青草视频免费观看 | 国产伦精品一区二区三区千人斩 | 天天爽天天爽天天爽 | 成人合集 | 亚洲一区二区三区国产 | 性色av一区二区三区在线观看 | 男女草逼视频 | 日韩免费精品视频 | 国产精品一二三四五区 | 日韩欧美二区三区 | 国产精品无码中文 | 精品少妇人妻av免费久久久 | 女同爱爱视频 | 中文字幕成人在线观看 | 黄色成年人视频 | 国产丰满大乳奶水在线视频 | 汗汗视频 | 性一交一乱一透一a级 | 国产日韩免费视频 | 91精品婷婷国产综合久久竹菊 | 香蕉中文网 | 成年人在线播放视频 | 国产av成人一区二区三区 | 久久久成人精品一区二区三区 | 九九九久久久精品 | 99ri在线| 欧美香蕉在线 | 欧美特级黄色 | 国产日韩在线看 |