首页 > 学院 > 开发设计 > 正文

蓝桥杯 01背包 动态规划

2019-11-11 03:05:15
字体:
来源:转载
供稿:网友
问题描述  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.输入格式  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。  以后N行每行两个数Wi和Vi,表示物品的重量和价值输出格式  输出1行,包含一个整数,表示最大价值。样例输入3 52 33 54 7样例输出8数据规模和约定  1<=N<=200,M<=5000.01背包的思路,定义一个二位数组 dp[i][j] 表示 背包剩余重量为i且物品件数为j的最大价值,然而对于每个物品都有买跟不买两种选择,所有,子问题: 是买还是不买此物品所能得到的最大价值 更大呢?由此可以得出动态方程:
 当i<0时           maxValue =0 
 其他情况	   maxValue = max(getMax(bagWeight-w[i],i-1)+v[i] ,getMax(bagWeight,i-1));	AC代码如下,
int weight[MAX_W][MAX_N] 数组 便是  dp[i][j]
#include<iostream>#include<cstdlib>#include<malloc.h>#include<algorithm>#include <memory.h>using namespace std;#define MAX_N 201#define MAX_W 5001  int w[MAX_N];	//物体重量 int v[MAX_N];   //物体价值 int n;			//物体个数int m;			//背包的最大重量 int weight[MAX_W][MAX_N]; //weight[i][j] 表示背包为i重量产品数为j 的最高价值 int getMax(int bagWeight,int i){	int value;	if(i < 0) return 0;			//没有物品	if(weight[bagWeight][i] != -1){		value=weight[bagWeight][i];	//“备忘录”,此前保存的最大值	} else if(i==0){			// 最后一个物品		if(bagWeight >= w[i])return v[i];	//买			else return 0;				//买不起	} 	else if(i!=0 && bagWeight >= w[i]){		//动态规划		value = max(getMax(bagWeight-w[i],i-1)+v[i] ,getMax(bagWeight,i-1));	} else {					//同样买不起		value = getMax(bagWeight,i-1);			}	weight[bagWeight][i] = value;			//保存最大值	return value;					//返回最大值} int main(){//	freopen("2.txt","r",stdin);	memset(weight,-1,sizeof(weight));//	cout<< sizeof(weight);	int maxValue=0;	cin>>n>>m;	for(int i=0;i<n;i++)		cin>>w[i]>>v[i];	maxValue=getMax(m,n-1);		cout<<maxValue;	return 0; }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表