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/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Java实现串口通信的小样例
    poi读写Excel
    java的list类
    java集合类
    常用正则表达式
    正则表达式
    Java获取路径中的文件名(正则表达式)
    poi读取word2003(.doc文档)中的表格
    使用poi读取word2007(.docx)中的复杂表格
    使用Maven搭建SpringMVC
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11216002.html
Copyright © 2011-2022 走看看