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/ 希望所写的文章对您有帮助。
  • 相关阅读:
    设计模式学习每日一记(1.简单工厂模式)
    poj1068
    设计模式学习每日一记(2.外观模式)
    qooxdoo一句话备忘录[不断更新]
    设计模式学习每日一记(4.抽象工厂)
    C# 各种数据类型的最大值和最小值常数
    ASP.NET中实现二级或多级域名(修改UrlRewrite)
    网站中定时发送邮件
    重提URL Rewrite(1):IIS与ASP.NET
    Server Application Unavailable 的解决方法
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11216002.html
Copyright © 2011-2022 走看看