题意:给一些石子,多次询问,问能不能测出所给重量
思路
①考虑把重量放在单独一边,石子放在单独一边。这样就是一个01背包。
②实际上重量那边也可以放石子,那么其实就是从①中的01背包中可以达到的状态,减去放在另一边的石子堆
所以这里也是一个类似01背包的过程,枚举石子,然后枚举重量,要注意第二维循环按照从小到大的。
否则按照从大到小的话,就是一堆石子会被放多次。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+50;
int a[N];
bool dp[N];
int main(){
    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 m;cin>>m;
        while(m--){
            int x;cin>>x;
            if(x<=sum && dp[x]) cout<<"YES\n";
            else cout<<"NO\n";
        }
        for(int i=1;i<=sum;i++){
            dp[i]=0;
        }
    }
    return 0;
}