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;  
}  

 

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