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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

动态规划0—1背包问题

發布時間:2023/11/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划0—1背包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????????????????????????????????????????????????????????????? ?動態規劃0-1背包問題

? ?? 問題描寫敘述: ?? 給定n種物品和一背包。物品i的重量是wi,其價值為vi,背包的容量為C。問應怎樣選擇裝入背包的物品,使得裝 入背包中物品的總價值最大? ? ? 對于一種物品,要么裝入背包,要么不裝。所以對于一種物品的裝入狀態能夠取0和1.我們設物品i的裝入狀態為xi,xi∈ (0,1),此問題稱為0-11背包問題。 ?????????????????????????????? 過程分析 ?

??? 數據:物品個數n=5,物品重量w[n]={0,2,2,6,5,4},物品價值V[n]={0,6,3,5,4,6},

???? (第0位,置為0,不參與計算,僅僅是便于與后面的下標進行統一,無特別用處,也可不這么處理。)總重量c=10.

?背包的最大容量為10,那么在設置數組m大小時,能夠設行列值為6和11,那么,對于m(i,j)就表示可選物品為i…n背包容量為j(總重量)時背包中所放物品的最大價值。

?

?????????????????????????????????????????

?

?

以下是自己寫的源代碼:

#include<stdio.h> #include<stdlib.h> #include<iostream> #include<queue> #include<climits> #include<cstring> using namespace std; const int c = 10; //背包的容量 const int w[] = {0,2,2,6,5,4};//物品的重量,當中0號位置不使用 。 const int v[] = {0,6,3,5,4,6};//物品相應的待加,0號位置置為空。 const int n = sizeof(w)/sizeof(w[0]) - 1 ; //n為物品的個數 int x[n+1]; void package0_1(int m[][11],const int w[],const int v[],const int n)//n代表物品的個數 {//採用從底到頂的順序來設置m[i][j]的值//首先放w[n]for(int j = 0; j <= c; j++)if(j < w[n]) m[n][j] = 0; //j小于w[n],所相應的值設為0,否則就為能夠放置 else m[n][j] = v[n];//對剩下的n-1個物品進行放置。int i;for(i = n-1; i >= 1; i--)for(int j = 0; j <= c; j++)if(j < w[i]) m[i][j] = m[i+1][j];//假設j < w[i]則,當前位置就不能放置,它等于上一個位置的值。//否則,就比較究竟是放置之后的值大,還是不放置的值大,選擇當中較大者。 else m[i][j] = m[i+1][j] > m[i+1][j-w[i]] + v[i]? m[i+1][j] : m[i+1][j-w[i]] + v[i]; } void answer(int m[][11],const int n) {int j = c;int i;for(i = 1; i <= n-1; i++)if(m[i][j] == m[i+1][j]) x[i] = 0;else { x[i] = 1;j = j - w[i];} x[n] = m[i][j] ? 1 : 0; } int main() {int m[6][11]={0};package0_1(m,w,v,n);for(int i = 0; i <= 5; i++){for(int j = 0; j <= 10; j++)printf("%2d ",m[i][j]);cout << endl; } answer(m,n);cout << "The best answer is:\n";for(int i = 1; i <= 5; i++)cout << x[i] << " ";system("pause");return 0; }


?

總結

以上是生活随笔為你收集整理的动态规划0—1背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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