01揹包,完全揹包C++實現
首先,上自己的程式碼,由於程式碼註釋詳細,我就不解釋啦。看程式碼就好O(∩_∩)O。
程式碼轉換為了01揹包問題求解。
不瞭解01揹包演算法的同學也可以到上述網址先學習。
本程式碼可以輸出價值與揹包中的物品。
供大家一起學習使用,如需轉載程式碼請告知本人。
先為大家雙手奉上執行結果。
#include<iostream> #include <algorithm> using namespace std; #define Volumn 14 //揹包總容量為Volumn-1 #define N 7 //存在N-1個物品 //包裹結構 typedef struct APac { int value;//包裹總價值 int k;//主函式中聲明瞭一個m[i][j]的二維陣列,k表示有k個i號物品 int smallPac;//揹包總容量減去k*i,即一個沒有i的小揹包 APac() { value = 0; k = 0; smallPac = 0; } }APac,*pPac; int main() { int v[N] = { 0,8,10,6,3,7,2 };//為了方便表示,0號位不使用,1~6表示價值 int w[N] = { 0,4,6,2,2,5,1 };//同樣,表示重量 //宣告揹包二維陣列 APac m[N][Volumn]; for (int i = 0; i < N; i++) { for (int j = 0; j < Volumn; j++) { m[i][j] = *new APac(); } } //採用01揹包方法,增加第三重k迴圈,求最值。 for (int i = 1; i < N; i++) { for (int j = 1; j < Volumn; j++) { //可以拿,判斷容量為j的揹包,不拿i價值高 還是 (拿i即i的價值加j-w[i]揹包的最高價值)高 for (int k = 0; k*w[i] <= j; k++) if (j >= w[i]) { //用於記錄揹包組成,與輸出揹包組成有關 if ((m[i - 1][j - k * w[i]].value + k * v[i]) >= m[i][j].value && (m[i - 1][j - k * w[i]].value + k * v[i]) >= m[i - 1][j].value) { m[i][j].k = k; m[i][j].smallPac = j - k * w[i]; } //記錄揹包價值 m[i][j].value = max(m[i][j].value, max(m[i - 1][j].value, m[i - 1][j - k * w[i]].value + k * v[i])); } else { //記錄揹包組成與價值 m[i][j].k = m[i - 1][j].k; m[i][j].smallPac = m[i - 1][j].smallPac; m[i][j].value = m[i - 1][j].value; } } } //輸出揹包價值 cout << "揹包價值" << endl; for (int i = 1; i < N; i++) { for (int j = 1; j < Volumn; j++) { cout << m[i][j].value << " "; } cout << endl; } cout << endl; //輸出揹包組成 cout << "揹包組成" << endl; int y = Volumn-1; for (int i = N-1; i > 0; i--) { cout << m[i][y].k<<"個"<<i<<" "; y = m[i][y].smallPac; } cout << endl; }
相關推薦
01揹包,完全揹包C++實現
首先,上自己的程式碼,由於程式碼註釋詳細,我就不解釋啦。看程式碼就好O(∩_∩)O。 程式碼轉換為了01揹包問題求解。 不瞭解01揹包演算法的同學也可以到上述網址先學習。 本程式碼可以輸出價值與揹包中的物品。 供大家一起學習使用,如需轉載程式碼請告知本人。 先為
演算法模板(一) 01揹包,多重揹包,完全揹包
01揹包 #include<bits/stdc++.h> using namespace std; int dp[300][3000]; int w[3000],v[3000]; int N,V; int main(){ cin>>N>>V; for(re
揹包問題-01揹包,完全揹包,多重揹包
揹包問題-01揹包,完全揹包,多重揹包 01揹包: 概念: 有Goods_Num件物品,MAX_Volume的最大裝載量,每種物品只有一件,每種物品都有對應的重量或者說體積Volume[i],價值Value[i],求解裝包的最大價值 狀態轉移方程推
史上最易懂的01揹包,完全揹包,多重揹包講解
揹包之01揹包、完全揹包、多重揹包詳解 PS:大家覺得寫得還過得去,就幫我把部落格頂一下,謝謝。 首先說下動態規劃,動態規劃這東西就和遞迴一樣,只能找區域性關係,若想全部列出來,是很難的,比
01揹包,完全揹包,多重揹包
01揹包 #include <stdio.h> int c[101][1001]={0};//定義100個物品1000重量的總價值陣列 void calcMaxValues(int n,
HDU2602/HDU1114/HDU2191(重新整理一下01揹包,完全揹包,多重揹包)
好長時間不做揹包的問題,有一點遺忘,現在把這些問題整理一下~ 一.01揹包(HDU2602) 題目:http://acm.hdu.edu.cn/showproblem.php?pid=2602 題意就
動態規劃之01揹包,完全揹包,分組揹包
一:01揹包 每樣物品只能取一件 狀態轉移方程 f[i][v]=max(f[i-1][v],f[i-1][v-weight[i]]+cost[i]) f[i][v]表示前i件物品裝入v的空間裡的最大價值,考慮第i件物品是否放入的問題,一種是不放入那就是前i-1件物品放入v中
01揹包,完全揹包,多重揹包的個人總結
大一剛接觸揹包問題的時候就覺得繞。那時候真的是一點程式碼基礎都沒有強行去理解。每次都是以失敗告終,一直到大二都還不會寫揹包問題。 後來某次模擬賽之後碰到了揹包問題,覺得這個還是挺簡單的,終於是下定決心準備搞一搞這個東西了。 有了一定的基礎理解起來就比以前容易多了。 首先,先
dp 01揹包,完全揹包,多重揹包 模板
轉自http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 首先說下動態規劃,動態規劃這東西就和遞迴一樣,只能找區域性關係,若想全部列出來,是很難的,比如漢諾塔。你可以說先把除最後一層的其
DP揹包問題小結(01揹包,完全揹包,需恰好裝滿或不需,一維DP、二維DP)
1) 揹包基礎,先以01揹包、求揹包所裝物品價值之和的最大值、不要求恰好裝滿時,易於理解的二維DP陣列儲存為例: #include <iostream> #include <string.h> using namespace std; int
揹包問題小總結 習題(動態規劃01揹包(第k優解)完全揹包,多重揹包)acm杭電HDU2639,HDU2602,HDU1114,HDU2191
1、01揹包(每種物品只有一個) 題目 有N件物品和一個容量為V的揹包。第i件物品的費用是c[i],價值是w[i]。 求解將哪些物 品裝入揹包可使價值總和最大。 基本思路 這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不放。 用子問題定義狀態:
01揹包、完全揹包、多重揹包、分組揹包
參考連結: 各種揹包的描述: 01揹包(ZeroOnePack): 有N件物品和一個容量為V的揹包。(每種物品均只有一件)第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。 完全揹包(CompletePack): 有N種
揹包問題(01揹包和完全揹包)java求解
揹包問題主要是指一個給定容量的揹包、若干具有一定價值和重量的物品,如何選擇物品放入揹包使物品的價值最大。其中又分01揹包和無限揹包,這裡主要討論01揹包,即每個物品最多放一個。而無限揹包可以轉化為01揹包。 先說一下演算法的主要思想,利用動態規劃來解決。每次遍歷到的第
【演算法總結】01揹包與完全揹包 模板整理
三種揹包的概念區分 01揹包(ZeroOnePack): 有N件物品和一個容量為V的揹包。每種物品均只有一件。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。完全揹
揹包問題詳解:01揹包、完全揹包、多重揹包
參考連結: 揹包問題是動態規劃演算法的一個典型例項,首先介紹動態規劃演算法: 動態規劃: 基本思想: 動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中, 可能會有很多可行解。沒一個解都對應於一個值,我們希望找到具有最優值的解。胎動規
揹包問題——“完全揹包”詳解及實現(包含揹包具體物品的求解)
原文地址:http://blog.csdn.net/wumuzi520/article/details/7014830 完全揹包是在N種物品中選取若干件(同一種物品可多次選取)放在空間為V的揹包裡,每種物品的體積為C1,C2,…,Cn,與之相對應的價值為W1
揹包問題入門 01揹包和完全揹包
01揹包問題 有N種物品,每種物品的數量為C1,C2……Cn。從中任選若干件放在容量為W的揹包裡,每種物品的體積為W1,W2……Wn(Wi為整數),與之相對應的價值為P1,P2……Pn(Pi為整數)。求揹包能夠容納的最大價值。 Input 第1行,2個整數
DP揹包之01揹包、完全揹包、多重揹包筆記
這是個經典話題,值得好好研究一番,本文作為學習筆記將會不斷更新。 主要參考了以下資料: 受益匪淺! 以下是Java的實現: package DP; import java.util.Arrays; public class Knapsack01 { s
01:單例模式——C++實現
目錄 一、介紹 二、應用場景 三、要點 四、樣例Demo 4.1、區域性靜態變數 4.2、懶漢式與餓漢式 懶漢式 餓漢式 4.3、執行緒安全 4.4、資源釋放 五、優缺點 優點 缺點: 一、介紹
0-1揹包與完全揹包 SDNUOJ1033採藥(一維陣列)1043採藥2(一維陣列)
1033(一維陣列)(揹包容量 j 逆序列舉)0-1揹包 #include<iostream> #include<cstring> #include<cmath> using namespace std; #define N 1005 int v[N]