hpu--C. 蚂蚁觅食(三)

C. 蚂蚁觅食(三)

单点时限: 2.0 sec
内存限制: 512 MB
马上就要冬天了,勤劳的小蚂蚁需要储存足够多的食物才能安全过冬。
今天,这只小蚂蚁走出巢穴寻找食物,但是这次蚁巢周围只有很少的食物,它需要去别的地方。
不幸的是小蚂蚁的体力很有限,而且每走一个单位长度就要消耗一点体力,不能找的时间太久,所以想让你帮忙计算一下它是否能用剩下的体力把足够多的食物搬回蚁巢。
由于蚂蚁的嘴太小,每次最多只能衔起一个食物。

输入格式

输入t组, t≤20
第一行三个数n,E,V表示食物的个数,蚂蚁剩余的体力,安全过冬需要的最少食物体积, 0<n≤200,0<E,V≤10000。
接下来n行,每行两个数pi,vi,表示第i个食物的位置和体积,0<p[i],v[i]≤1000。
初始蚂蚁和蚁巢均在坐标轴原点。

输出格式

每个输出占一行。
如果蚂蚁能安全过冬,输出 “YES”,否则输出”NO”。
样例

Input

2
1 2 2
1 2
1 2 2
2 1


Output

YES
NO


刚开始没看出来,只想着用dfs,果不其然,tle到自闭,后来才发现,这道题就是个01背包,下次在遇见这种题就要变一下思维模式了,遇见这种每次有两种选择的都可以考虑用0 1背包去解决!
代码参上

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,e,v;
int w[1000];     //w[i]代表取第i个物品消耗的能量 
int vi[1000];     //v[i]代表第i个物品的体积 
int dp[100000];
int main()       //这样一搞还真就是01背包 
{
	int t;
	cin>>t;      
	while(t--)
	{
		cin>>n>>e>>v;
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++){
			cin>>w[i]>>vi[i];
			w[i]=w[i]*2;
		}
		for(int i=0;i<n;i++)
			for(int j=e;j>=w[i];j--)
				dp[j]=max(dp[j],dp[j-w[i]]+vi[i]);
		if(dp[e]>=v)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl; 
	}
	return 0;
	//吃一堑长一智下回好好搞
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值