zoukankan      html  css  js  c++  java
  • QAU 18校赛 J题 天平(01背包 判断能否装满)

    问题 J: 天平

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 36  解决: 9
    [提交][状态][讨论版][命题人:admin]

    题目描述

    天平的右端放着一件重量为w的物品。现在有n个重量已知的砝码,只允许在左端放砝码的前提下,能否通过砝码判断出物品的重量。

    (注:这里假设当天平的两端重量不同时天平就会向重的一端倾斜到底!)

    输入

    输入包含两行,第一行包含两个整数w(1<=w<=1000)和n(1<=n<=1000),w表示物品的重量,n表示砝码的数量。

    第二行包含n个整数,x1x2...xn(1 ≤ xi ≤ 1000),表示每个砝码的重量。

    输出

    如果能够用天平判断出物品的重量,输出Yes。

    如果不能,输出No。

    样例输入

    3 2
    1 2
    
    5 3
    3 4 4

    样例输出

    Yes
    No


    解析:
    分为两种情况,1、正好装满w 2、能够装满w-1 和 w+1 那么就可以判断出w的是多少

    01背包加一个判断即可 就是在要装当前背包容量j时 要判断一下 j-W[i]是否存在,把dp[0]初始化为1 那么就可以保证这个背包是由固定的
    重量组成的最大值
    我真是蠢啊。。。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <cmath>
    #include <algorithm>
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int maxn = 10010, INF = 0x7fffffff;
    int A[maxn], dp[maxn];
    int main()
    {
        int w, n;
        cin>> w >> n;
        mem(dp, 0);
        dp[0] = 1;
        for(int i=0; i<n; i++)
        {
            cin>> A[i];
            for(int j=w+1; j>=A[i]; j--)
                if(dp[j-A[i]]) dp[j] = 1;
        }
        if(dp[w])
            cout<< "Yes" <<endl;
        else if(dp[w-1] && dp[w+1])
            cout<< "Yes" <<endl;
        else
            cout<< "No" <<endl;
        return 0;
    }
     
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式
    干货 | 掌握 Selenium 元素定位,解决 Web 自动化测试痛点
    代理技术哪家强?接口 Mock 测试首选 Charles
    浅谈MVC缓存
    PetaPoco 快速上手
    解释器模式(26)
    享元模式(25)
    中介者模式(24)
    职责链模式(23)
    命令模式(22)
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9220319.html
Copyright © 2011-2022 走看看