zoukankan      html  css  js  c++  java
  • HDU 1709 The Balance( DP )

    The Balance

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 5956    Accepted Submission(s): 2427


    Problem Description
    Now you are asked to measure a dose of medicine with a balance and a number of weights. Certainly it is not always achievable. So you should find out the qualities which cannot be measured from the range [1,S]. S is the total quality of all the weights.
     
    Input
    The input consists of multiple test cases, and each case begins with a single positive integer N (1<=N<=100) on a line by itself indicating the number of weights you have. Followed by N integers Ai (1<=i<=N), indicating the quality of each weight where 1<=Ai<=100.
     
    Output
    For each input set, you should first print a line specifying the number of qualities which cannot be measured. Then print another line which consists all the irrealizable qualities if the number is not zero.
     
    Sample Input
    3
    1 2 4
    3
    9 2 1
     
    Sample Output
    0
    2
    4 5
     
     
    一条挺有意思的递推。
    就是问给出n个重量为wi的砝码。
    问你不能称出的重量有哪些。
    bool  dp[i][j] 表示前i个砝码, 能否称出重量 j 。
     
    初始化dp[0][0] = true ;
    对于一个 dp[i-1][j] = true , 必然有 dp[i][j+a[i]] = true , dp[i][abs(j-a[i])] = true 
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <map>
    #include <set>
    #include <stack>
    #include <algorithm>
    using namespace std;
    #define root 1,n,1
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    #define lr rt<<1
    #define rr rt<<1|1
    typedef long long LL;
    typedef pair<int,int>pii;
    #define X first
    #define Y second
    const int oo = 1e9+7;
    const double PI = acos(-1.0);
    const double eps = 1e-6 ;
    const int N = 10500;
    const int mod = 1e9+7;
    bool dp[105][N];
    int n , m , a[N] , b[N] , tot ;
    void init() {
        memset( dp , false ,sizeof dp );
        dp[0][0] = true ;
        for( int i = 1 ; i <= n ; ++i ){
            for( int j = 0 ; j <= tot ; ++j ){
                if( dp[i-1][j] ) dp[i][j] = dp[i-1][j];
                if( dp[i-1][j] ){
                    dp[i][j+a[i]] = true ; dp[i][abs(j-a[i])] = true ;
                }
            }
        //    for( int j = 0 ; j <= tot ; ++j ) cout << dp[i][j] << ' '; cout << endl ;
        }
    }
    void Run() {
        tot = 0 ;
        for( int i = 1 ; i <= n ; ++i ) 
            cin >> a[i] , tot += a[i];
        init(); int cnt = 0 ;    
        for( int i = 1 ; i <= tot ; ++i ) if( !dp[n][i] ){
            b[cnt++] = i ;
        }
        cout << cnt << endl ;
        for( int i = 0 ; i < cnt ; ++i ) 
            cout << b[i] << (i+1==cnt?"
    ":" ");
    
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
        ios::sync_with_stdio(false);
        while( cin >> n ) Run();
    }
    View Code
    only strive for your goal , can you make your dream come true ?
  • 相关阅读:
    【ARTS】打卡第七周
    【ARTS】打卡第六周
    【ARTS】打卡第五周
    【leetcode】 438. Find All Anagrams in a String
    【ARTS】打卡第四周
    【ARTS】打卡第三周
    【leetcode】 11. Container With Most Water
    【ARTS】打卡第二周
    【ARTS】打卡第一周
    深度VS广度——谈谈对测试职业的一些思考
  • 原文地址:https://www.cnblogs.com/hlmark/p/4204620.html
Copyright © 2011-2022 走看看