小M和天平

小M和天平

https://ac.nowcoder.com/acm/problem/13586

题解:
分成两种情况来讨论:
1.石头单独放到一边,这样就是看看石头能凑出哪些数即可。
2.另一边也可以放石头,那么那个重物就是,全为石头一边的重量-另一边石头的重量。
分好这两种情况之后就可以进行dp了。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int maxn=1e5+10;

int a[maxn];
bool dp[maxn];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    while(cin>>n){
        int sum=0;
        for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=sum;j>=a[i];j--){
                dp[j]|=dp[j-a[i]];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=sum-a[i];j++){
                dp[j]|=dp[j+a[i]];
            }
        }
        int q;
        cin>>q;
        for(int i=0;i<q;i++){
            int x;
            cin>>x;
            if(x<=sum&&dp[x]) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        for(int i=0;i<=sum;i++) dp[i]=0;
    }
    return 0;
}


全部评论

相关推荐

10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务