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/ 希望所写的文章对您有帮助。
  • 相关阅读:
    慕课网 k8s环境搭建坑点
    这种yum源为阿里云
    linux yum安装jdk
    docker 常用命令
    docker部署
    docker windows安装 就是这么简单
    idea
    jrebel 破解失败 Unexpected response from server
    bladex flowable 表关系
    bladex 接口
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11216002.html
Copyright © 2011-2022 走看看