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