做题总结——小M和天平
题目
题意分析:
根据这道题给出的数据范围可以知道,利用所有的石头能够查询的物体质量是不会查过100*100=10000的,所以可以直接利用暴力枚举的方法进行求解。
做题思路: 利用一个二维数组dp[i] [j],其中i表示前i个石头,j表示物体质量,如果利用前i个石头能够称出质量为j的物体,则dp[i][j]标记为1,否则为0。如果dp[i-1][j]=1,则可以得出三个结论:dp[i][j]一定等于1、dp[i][j w[i]]一定等于1、dp[i][abs(j-w[i])]一定等于1(w[i]是第i个石头的质量),所以只需要对i、j进行枚举即可解决。
代码实现
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
int dp[102][10002];
int main()
{
int n,m,data;
while(cin>>n)
{
int i,j,w[102];
memset(w,0,sizeof(w));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i )
{
cin>>w[i];
}
dp[0][0]=1;
for(i=1;i<=n;i )
{
for(j=0;j<=10000;j )
{
if(dp[i-1][j]) //这里是整道题目的关键
{
dp[i][j]=1;
dp[i][j w[i]]=1;
dp[i][abs(j-w[i])]=1;
}
}
}
cin>>m;
while(m--)
{
cin>>data;
if(data<=10000 && dp[n][data]) //如果n块石头能够称出质量为data的物体,并且物体质量<=10000
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
}
return 0;
}