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;
//吃一堑长一智下回好好搞
}