小M和天平

来源:互联网 发布:写九九乘法表c语言 编辑:程序博客网 时间:2024/04/30 22:26

Description

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

Input

多组输入,对于每组测试数据
第一行一个数NN,表示石子个数。(1N100)(1≤N≤100)
接下来第二行NN个数,表示石子的重量。(1Wi100)(1≤Wi≤100)
接下来第三行一个数MM,表示询问个数。(1M1000)(1≤M≤1000)
接下来M行每行一个数k(1k109)k(1≤k≤109),表示一个询问。

Output

对于每组数据,输出"YES"或者"NO"

Sample Input

21 43245

Sample Output

NOYES

YES

思路:傻逼dp题,比赛的时候我队友去写结果卡了,我没去想,现在来写发现就是道傻逼dp

状态为dp[i][j] i为前i个物品,j为相对重量,dp值为是否能到达这个状态

ac代码:

#include<cstdio>#include<algorithm>#include<cstring>#include<map>#include<vector>#include<iostream>#include<sstream>#include<cmath>#include<string>#include<set>#include<list>#include<stack>#include<queue>using namespace std;int dp[100+5][10000+5];int a[100+5];int vis[10000+5];int n,m;int main(){    while(~scanf("%d",&n))    {        for(int i = 1;i <= n; i++)        {            scanf("%d",&a[i]);        }        memset(vis,0,sizeof(vis));        memset(dp,0,sizeof(dp));        for(int i = 0 ;i<=n;i++)        {            dp[i][0]=1;        }        for(int i = 1;i <= n; i++)        {            for(int j = 10000; j >= 0;j--)            {                if(dp[i-1][j])                {                    dp[i][abs(a[i]-j)] = 1;                    dp[i][a[i]+j] = 1;                    dp[i][j] = 1;                }            }        }        scanf("%d",&m);        for(int i = 0 ;i < m;i++)        {            long long x;            scanf("%lld",&x);            if(x>10000)            {                puts("NO");            }            else if(dp[n][x])            {                puts("YES");            }            else                puts("NO");        }    }    return 0;}


0 0