牛客-TaoTao要吃鸡(背包dp)

https://ac.nowcoder.com/acm/problem/15030

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e3+10;
const int inf=0x3f3f3f3f;

int dp[maxn],v[maxn],w[maxn];
//01背包
//最初想法为背包+记录,回溯判断背包满不满,然后再抓剩下的一个威力最大的装备。
//但是仔细想想,这样的话,拿的装备是威力相对较大,且重量也较大的,但是这没法分辨,所以需要全部遍历。 
//由于数据很小,所以枚举拿每一种装备时的可能性。 

int main(){ 
    int n,m,h;
    while(cin>>n>>m>>h){
    	memset(dp,0,sizeof(dp));
    	for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    	dp[0]=0;
    	int mx=-inf;
    	for(int k=1;k<=n;k++){		//枚举装备没满时候,固定拿的一件装备 
    		memset(dp,0,sizeof(dp));
    		for(int i=1;i<=n;i++)	//01背包 
    			for(int j=m+h;i!=k&&j>=v[i];j--)
    				dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
			if(h) mx=max(dp[h+m-1]+w[k],mx);	//当装备未满,最大空间为m+h-1,此时拿一件装备,但是h=0情况,仍会出现未满情况,但不可以拿装备
			else mx=max(dp[m+h],mx);			//但是h=0情况,仍会出现未满情况,但不可以拿装备。(当装备满,空间为m+h。)  
		}
		cout<<mx<<endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值