代码源:710、背包

316 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情logo.png

题目描述

这是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;
}