zoukankan      html  css  js  c++  java
  • Jam's balance HDU

    Jim has a balance and N weights. (1≤N≤20)
    The balance can only tell whether things on different side are the same weight.
    Weights can be put on left side or right side arbitrarily.
    Please tell whether the balance can measure an object of weight M.
    Input
    The first line is a integer T(1≤T≤5), means T test cases.
    For each test case :
    The first line is N, means the number of weights.
    The second line are N number, i'th number wi(1≤wi≤100) means the i'th weight's weight is wi.
    The third line is a number M. M is the weight of the object being measured.
    Output
    You should output the "YES"or"NO".
    Sample Input
    1
    2
    1 4
    3
    2
    4
    5
    Sample Output
    NO
    YES
    YES

    Hint
    For the Case 1:Put the 4 weight alone
    For the Case 2:Put the 4 weight and 1 weight on both side

    题意:
    给你n个砝码,q个询问,对于每一个询问,你需要回答这n个玛法能否选取一些玛法的组合称量出x的重量。砝码可以放在天平的左侧和右侧。
    思路:

    01背包基础题。

    定义dp[x] =1 表示可以测量x重量。

    正着扫一遍,反着扫一遍即可,代码有注释。

    细节见代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define rt return
    #define dll(x) scanf("%I64d",&x)
    #define xll(x) printf("%I64d
    ",x)
    #define sz(a) int(a.size())
    #define all(a) a.begin(), a.end()
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
    using namespace std;
    typedef long long ll;
    ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
    ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
    ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
    inline void getInt(int* p);
    const int maxn = 1000010;
    const int inf = 0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    int dp[maxn];
    int a[maxn];
    int main()
    {
        //freopen("D:\code\text\input.txt","r",stdin);
        //freopen("D:\code\text\output.txt","w",stdout);
        int t;
        gbtb;
        cin>>t;
        while(t--)
        {
            int n,q,w;
            cin>>n;
            int sum=0;
            repd(i,1,n)
            {
                cin>>a[i];
                sum+=a[i];
            }
            MS0(dp);
            dp[0]=1;
            repd(i,1,n)
            {
                for(int j=sum;j>=a[i];--j)//   一定要反着dp,,因为砝码的个数1 个,
                {
                    // 从后向前可以避免当前修改的dp[j]在本次过程中的后续中有影响。
                    if(dp[j-a[i]]==1)
                    {
                        dp[j]=1;
                    }
                }
            }
            repd(i,1,n)
            {
                for(int j=1;j<=sum;++j)
                {
                    if(dp[j+a[i]]==1)// 把a[i]放在天平的反侧,就可以测量出 j的重量。
                    {
                        dp[j]=1;
                    }
                }
            }
            cin>>q;
            while(q--)
            {
                cin>>w;
                if(dp[w])
                {
                    cout<<"YES"<<endl;
                }else
                {
                    cout<<"NO"<<endl;
                }
            }
        }
        return 0;
    }
    
    inline void getInt(int* p) {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        }
        else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }
    
    
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    [快捷键的使用] IntelliJ IDEA 将数据库里面的表转化为对象
    Mybatis事物浅谈
    CentOS7系统局域网内配置本地yum源解决cannot find a valid baseurl for repo
    CentOS6.5系统解决中文乱码问题
    tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
    zabbix3.4.8中提示host [4gronghe_110] not found
    CentOS7.6系统安装详解(含真机装系统的采坑之旅)!
    windows server 2012 R2修改默认远程端口
    两个div并排,右边div固定宽度,左边宽度自适应
    两个div并排,左边div固定宽度,右边宽度自适应
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11216002.html
Copyright © 2011-2022 走看看