蓝桥杯 01背包 动态规划

问题描述
  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
  以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
  输出1行,包含一个整数,表示最大价值。
样例输入
3 5
2 3
3 5
4 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; 
} 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值