一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
题目描述
这是4月9日代码源div2的每日一题。
背包 - 题目 - Daimayuan Online Judge
cc有一个背包,背包的体积为w,有n个物品,每一个物品的体积为ai
cc希望将其中的一些物品放入他的背包中,他希望这些物品的体积之和至少是背包体积的一半,并且不超过背包的体积,即 ⌈w/2⌉≤sum≤w⌈w/2⌉≤sum≤w
请你帮cc判断这些物品中有没有符合条件的物品组合,如果有输出"YES", 没有输出"NO"
cc至少会拿一个物品
输入格式
第一行给出测试样例个数T
对于每一个样例:
第一行给出一个n和一个w,n个物品,背包的总体积是w
第二行给出一个序列a1,...an,代表每一个物品的体积
输出格式
如果有请输出"YES", 没有输出"NO"
数据范围
1≤t≤1e4 ,1≤∑n≤2e5,1≤w≤1e18 0≤wi≤1e9
样例输入1
3
1 3
3
6 2
19 8 19 69 9 4
7 12
1 1 1 17 1 1 1
样例输出
YES
NO
YES
\
问题解析
遍历一下他给的物品,小于等于背包体积一半的都装背包里,不满足条件的直接看那个货物是不是就在w/2~w之间。
首先你小于一半的装背包里,当你背包已经装了一半的时候已经满足条件了,不满足一半的时候你装一个小于一半的肯定也不会超。
AC代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define endl '\n';
typedef long long ll;
typedef pair<int, int> PII;
int main()
{
int t;
cin >> t;
while (t--)
{
ll n, m;
cin >> n >> m;
ll res = 0;
vector<ll>v(n);
bool flag = false;
for (int i = 0; i < n; i++)
{
cin >> v[i];
if (!flag&&v[i] >= (m + 1) / 2 && v[i] <= m)
{
cout << "YES" << endl;
flag = true;
}
}
if (flag)continue;
for (int i = 0; i < n; i++)
{
if (v[i] < (m + 1) / 2)
{
res += v[i];
}
if (res >= (m+1) / 2 && res <= m)
{
flag = true;
cout << "YES" << endl;
break;
}
if (res > m)break;
}
if (!flag)cout << "NO" << endl;
}
return 0;
}