小M和天平(简单DP)

题目链接:

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

题目大意:

小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,石子可以放左边也可以放右边。他现在知道每个石子的重量。问能不能根据上述条件,能不能测出所问的重量。

数据范围:

多组数据,第一行一个数N,表示石子个数。(1<=N<=100) 接下来第二行N个数,表示石子的重量。(1<=Wi<=100) 接下来第三行一个数M,表示询问个数。(1<=M<=1000) 接下来M行每行一个数k(1<=k<=1e9),表示一个询问。

具体思路: 

观察数据范围,发现k的范围只是吓人的。这个题的最大的能称量的范围就是10000.也就是说当k大于10000的时候,一定是输出NO。对于另外的情况,两个for循环暴力就可以了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace  std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 2e4+100;
 6 int dp[100+10][maxn];
 7 int a[maxn];
 8 int main()
 9 {
10     int n;
11     while(~scanf("%d",&n))
12     {
13         for(int i=1;i<=n;i++){
14         scanf("%d",&a[i]);
15         }
16         memset(dp,0,sizeof(dp));
17         dp[0][0]=1;
18         for(int i=1; i<=n; i++)
19         {
20             for(int j=0; j<=1000; j++)
21             {
22                 if(dp[i-1][j])
23                 {
24                     dp[i][j]=1;
25                     dp[i][j+a[i]]=1;
26                     dp[i][abs(j-a[i])]=1;
27                 }
28             }
29         }
30         int m;
31         scanf("%d",&m);
32         while(m--)
33         {
34             int tmp;
35             scanf("%d",&tmp);
36             if(tmp<=10000&&dp[n][tmp])
37                 printf("YES
");
38             else
39                 printf("NO
");
40         }
41     }
42     return 0;
43 }
原文地址:https://www.cnblogs.com/letlifestop/p/10955384.html