题意:给一些石子,多次询问,问能不能测出所给重量
思路:
①考虑把重量放在单独一边,石子放在单独一边。这样就是一个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; }