01揹包問題(dfs/DP)

描述

一個旅行者有一個最多能裝 M 公斤的揹包,現在有 n 件物品,它們的重量分別是W1,W2,...,Wn,它們的價值分別爲C1,C2,...,Cn,求旅行者能獲得最大總價值。

格式

輸入格式

第一行:兩個整數,M(揹包容量,M≤200)和N(物品數量,N≤30); 第2..N+1行:每行二個整數Wi,Ci,表示每個物品的重量和價值。

輸出格式

僅一行,一個數,表示最大總價值。

樣例

輸入樣例

10 4
2 1
3 3
4 5
7 9

輸出樣例

12

限制

時間限制: 1000 ms

內存限制: 65536 KB

揹包九講專題

 

01揹包問題的視頻講解

//深搜回溯
#include<bits/stdc++.h>
using namespace std;

struct goods{
	int w;
	int c;
} g[35];
int sumC=0, tmp=0, sumW=0, m, n;

void dfs(int k) {
	if (sumW > m) {
		return;
	}
	if (tmp > sumC) {
		sumC = tmp;
	}
	for (int i=k; i<n;i++){
		sumW += g[i].w;
		tmp += g[i].c;
		dfs(i+1);
		tmp -= g[i].c;
		sumW -= g[i].w;
	}
} 

int main()  
{  
	scanf ("%d %d", &m, &n);
	for (int i=0; i<n; i++) {
		scanf ("%d %d", &g[i].w, &g[i].c);
	}
	for (int j=0; j<n; j++){
		tmp = 0;
		dfs(j);
	}
	printf ("%d", sumC);
    return 0;  
}  

 

//動規
#include<bits/stdc++.h>
using namespace std;

struct goods{
	int w;
	int c;
} g[35];

int main()  
{  
	int m, n, f[35][250];		//f[i][j]中,i表示第i個物件,j表示剩下多少空間 
	scanf ("%d %d", &m, &n);
	for (int i=1; i<=n; i++) {
		scanf ("%d %d", &g[i].w, &g[i].c);
	}
	for (int i=1; i<=n; i++) {
		for (int j=m; j>0; j--) {
			if (g[i].w > j) {
				f[i][j] = f[i-1][j];		//當第i件太重時,選擇前面的i-1件 
			} else {						 
				f[i][j] = max(f[i-1][j], 
					f[i-1][j-g[i].w]+g[i].c);	//放與不放在於價值是否最大
			}
		}
	}
	printf ("%d", f[n][m]);
    return 0;  
}  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章