蚂蚁觅食3

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

输入格式

输入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
单击复制
01背包问题,这里的路程的2倍是重量,体力为背包大小,食物体积为价值,套入模板

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
int n,e,v;
int p[10010],w[10010];
int dp[123456];
scanf("%d",&t);

while(t--)
{
	memset(dp,0,sizeof(dp));
	scanf("%d%d%d",&n,&e,&v);
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&p[i],&w[i]);
		p[i]*=2;
	}
	for(int i=0;i<n;i++)
		for(int j=e;j>=p[i];j--)
			dp[j]=max(dp[j],dp[j-p[i]]+w[i]);
	if(dp[e]>=v)	printf("YES\n");
	else printf("NO\n");
}
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值