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/ 希望所写的文章对您有帮助。
  • 相关阅读:
    开发过程中解决各种跨域问题
    使用vux的x-input组件中show-clear=“true”清除icon点击失效的问题
    Vue项目使用域名访问配置
    Taro 压缩图片api
    javascript实现继承的4种方法,以及它们的优缺点
    解决window.opener.obj instanceof Object会输出false的问题
    javascript实现引用数据类型的深拷贝和浅拷贝详解
    javascript检测基本类型值或引用类型值的类型方法
    git merge合并时遇上refusing to merge unrelated histories的解决方案
    vue-router+webpack线上部署时单页项目路由,刷新页面出现404问题
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11216002.html
Copyright © 2011-2022 走看看