1. 程式人生 > >01揹包,完全揹包C++實現

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杭電HDU2639HDU2602HDU1114HDU2191

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]