其他分享
首页 > 其他分享> > 蚂蚁觅食3

蚂蚁觅食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;

}

标签:体力,蚂蚁,int,小蚂蚁,觅食,食物,dp
来源: https://blog.csdn.net/qq_44219784/article/details/98470641