1. 程式人生 > >動態規劃解0-1揹包問題

動態規劃解0-1揹包問題

題目如下:

試用動態規劃的方法,求解0-1揹包問題:有一揹包,能裝入物體總重量為C,n個物體,重量為w1,w2,..,wn,價值分別為v1,v2,…vn。試求一種裝載方案,使得揹包裝載的物體總價值最大。其中,C, w都是整數。

解題思路:

簡單dp

	試用動態規劃的方法,求解0-1揹包問題: 有一揹包,能裝入物體總重量為C, 
有n個物體,重量為w1,w2,..,wn, 價值分別為v1,v2,…vn。試求一種裝載方案,
使得揹包裝載的物體總價值最大。其中,C, w都是整數。*/
#include<stdio.h>
#define N 50

int max(int a,int b)
{
	return a>b?a:b;
}

void KnapSack(int n,int C,int w[],int m[])
{
	int i,j,V[N][N],x[N];
	for(i=0;i<=n;i++)
		V[i][0]=0;
	for(j=0;j<=C;j++)
		V[0][j]=0;
	
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=C;j++)
		{
			if(j<w[i])
				V[i][j]=V[i-1][j];
			else
				V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+m[i]);
		}
	}
	j=C;
	for(i=n;i>0;i--)
	{
		if(V[i][j]>V[i-1][j])
		{
			x[i]=1;
			j=j-w[i];
		}
		else
			x[i]=0;			
	}

	printf("構成最大價值的物品是:");
	for(i=1;i<=n;i++)
	{
		if(x[i]!=0)
			printf("%d ",i);
	}
	printf("\n最大價值為:%d\n",V[n][C]);
}

void main()
{
	int w[N],m[N];
	int C,i,n;
	printf("請輸入揹包的容量:");
	scanf("%d",&C);
	printf("請輸入物品的個數:");
	scanf("%d",&n);
	printf("請輸入每個物品的質量和價值,以分號隔開\n");
	w[0]=m[0]=0;
	for(i=1;i<=n;i++)
	{
		printf("第%d個物品的質量和價值分別為:",i);
		scanf("%d%d",&w[i],&m[i]);
	}
	KnapSack(n,C,w,m);
}


相關推薦

動態規劃0-1揹包問題(C語言版)

這學期開的演算法課,感覺好難,光這個問題就弄了好久,我這裡的程式碼非本人原創程式碼,都是借鑑網上的程式碼按自己的理解加以改進的,原網頁地址 為http://www.cnblogs.com/qinyg/archive/2012/04/26/2471829.html 問題描

動態規劃0-1揹包問題

題目如下: 試用動態規劃的方法,求解0-1揹包問題:有一揹包,能裝入物體總重量為C,有n個物體,重量為w1,w2,..,wn,價值分別為v1,v2,…vn。試求一種裝載方案,使得揹包裝載的物體總價值最大。其中,C, w都是整數。 解題思路: 簡單dp 試用動態規劃

動態規劃0-1揹包問題(POJ3624)

有N件物品和一個容積為M的揹包。第i件物品的體積w[i],價值是d[i]。求解將哪些物品裝入揹包可使價值總和最大。每種物品只有一件,可以選擇放或者不放。(N<=3500,M<=130000)。 解題思路: 用F[i][j]表示取前i種物品,使它們總體積不超過j的最優取法取

動態規劃實現0-1揹包問題

//動態規劃實現0-1揹包 public class DN01 { public static void dy(int []v,int []w,int c,int [][]m){ int n=v.length-1; //i=n int jMax=Math.min(w[n]-1,

【演算法】動態規劃解決0-1揹包的兩個疑惑

1. 揹包問題 描述: 給定 n 種物品,每種物品有對應的重量weight和價值value,一個容量為 maxWeight 的揹包,問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大? 過程:   a) 把揹包問題抽象化(X1,X2,…,Xn,其中 Xi

動態規劃0-1揹包問題

問題: 物品集合s={1,2,3,4,…,n},物品i的重量為wi,其價值為vi,揹包的容量(最大載重量)為W,如何裝使物品價值最大。(物品不能分割) 分析: p(i,j)是揹包容量為j,可選物品為i(i+1,…,n)時的最優解 (“將前i個物品放入容量為j的揹

動態規劃0-1揹包問題,鋼條切割

動態規劃 首先說說動態規劃:動態規劃與分治法相似,都是組合子問題的解來解決原問題的解,與分治法的不同在於:分治法的子問題是相互獨立存在的,而動態規劃應用於子問題重疊的情況。 設計動態規劃演算法的步驟: 1、刻畫一個最優解的結構特徵 2、遞迴地定義最優解的

動態規劃問題——0/1揹包問題(Java實現)

1、問題描述0-1揹包問題:        給定N件物品和一個容量為V的揹包。放入第i件物品耗費的空間為C[i] ,得到的價值是 W[i] 。        問:哪些物品裝入揹包可使價值總和最大?最大是多少?2、基本思路2.1  基本思路   這是最基礎的揹包問題,特點是:每

動態規劃演算法0-1揹包問題java實現

問題描述:給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是M,問如何選擇裝入揹包中的物品總價值最大? import java.util.ArrayList; import java.util.HashMap; /* * 實際就是一種分而治之的思想

動態規劃、貪心、回溯、分支限界法0-1揹包問題總結

本文通過0-1揹包問題的不同解法,深入理解計算機常用演算法動態規劃、貪心、回溯、分支限界法的思想。 問題描述 0-1揹包問題:給定n種物品和一揹包。物品i的重量是wi,其價值是vi,揹包的容量為C。問:應該如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值

動態規劃法解決0/1揹包問題詳

是什麼          動態規劃(dynamic programming)是求解決策過程最優化的數學方法,把多階段過程轉換為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問

nyoj 49-開心的小明(動態規劃0-1背包問題)

限定 std btn inpu 描述 背包 代碼 OS 出了 49-開心的小明 內存限制:64MB 時間限制:1000ms Special Judge: No

動態規劃法例子     0-1揹包問題

/*     動態規劃法例子     0-1揹包問題 */ //物品個數 const int n = 5; // 重量 int Weight[n] = {3,4,7,8,9}; // 價值 int Values[n] = {4,5,10,11,13}; // 揹包總

優先佇列式分支限界法0-1揹包問題

0-1 揹包問題的描述在上一篇《回溯法解0-1揹包問題》中已有說明。 現在採用優先佇列式分支限界法來求解; 1. 優先佇列中節點i的優先順序由該節點的上界函式bound計算出的值upperprofit給出。該上界函式與回溯法中計算方法一致。 子集樹中以i結點為跟的子樹的任一節點的上界不會

使用動態規劃法解決0/1揹包問題

問題: 給定n種物品和一個揹包i(1<=i<=n)的重量是Wi,其價值為Vi,揹包的容量為C,對每種物品只能有兩種選擇:裝入或者不裝入揹包。如何選擇裝入揹包的物品使得裝入揹包中的物品的總價

動態規劃問題筆記1-揹包問題

最近刷題時碰到了動態規劃的問題,最開始覺得很難,無從下手,研究了一下動態規劃問題,覺得很神奇,做點兒筆記記錄下。 結合具體的問題來理解比單獨研究理論更形象一些。 問題: 要從物品重量為[2,3,5,5,10,2,8]的7個物體中選擇幾個物體放入容量為1

[C/C++] 回溯法0-1揹包問題

用最小的空間裝最大價值的物品是經典的揹包問題,而0-1揹包是揹包問題中最簡單的情況,常見的做法有動態規劃和回溯法等。本文用更為容易理解的回溯法來解決該問題。我們把每個輸入的物品都看做一個節點,用標記陣列來標記是否使用該物品,於是物品節點之間能夠生成一顆二叉樹,二叉樹節點的左子

動態規劃0-1背包問題原理和實現

最大 一個 get ++ string span ati 0-1背包問題 div 0 1背包——每種物品只能選0件或者1件 /** * weight[] = {2,3,4,5} * value[] = {3,4,5,7} * 求

0-1揹包問題(動態規劃

http://acm.hdu.edu.cn/showproblem.php?pid=1171 這道題咋看有點複雜,其實也只是換了一種思維,因為題目要求要儘量平均分配,所以我們可以先將總價值sum求出,然後得出其分配的平均值為sum/2,要注意這個答案可能為小數,但是又因為sum是整數,所以最

動態規劃-0-1揹包問題

給定n個物品和一個揹包。物品i的重量為wi,價值為vi,揹包容量為c。問如何選擇裝入揹包中的物品,使得裝入揹包的物品的價值最大?在裝入揹包時,每種物品i只有兩種選擇,裝入或者不裝入,既不能裝入多次,也不能只裝入一部分。 因此,此問題稱為0-1揹包問題.0-1揹包問題是一個特殊的整數規劃問題。