HDU 5616 Jam's balance

3292 단어
배낭dp[i]=1은 i라는 차치가 조합될 수 있음을 나타내고 차치가 마이너스가 있기 때문에sum로 0을 나타내고 0은-sum을 나타내며 2*sum는sum를 나타낸다.
X를 물어볼 때 dp[sum+X] 또는 dp[sum-X] 중 하나가 1인지 확인하면 RE에 주의한다.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

int dp[8000];
int w[50];
int flag[8000];

int main()
{
    int T,N,M;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        memset(dp,0,sizeof dp);
        for(int i=1;i<=N;i++) scanf("%d",&w[i]);
        int sum=0;
        for(int i=1;i<=N;i++) sum=sum+w[i];
        dp[sum]=1;

        for(int i=1;i<=N;i++)
        {
            memset(flag,0,sizeof flag);
            for(int j=2*sum;j>=0;j--)
            {
                if(dp[j])
                {
                    if(j+w[i]<=2*sum) flag[j+w[i]]=1;
                    if(j-w[i]>=0) flag[(j-w[i])]=1;
                }
            }
            for(int i=0;i<=2*sum;i++) if(flag[i]) dp[i]=1;
        }

        scanf("%d",&M);
        for(int i=1;i<=M;i++)
        {
            int x;
            scanf("%d",&x);
            if(x>sum||x<0) printf("NO
"); else { if(dp[sum+x]==1||(sum-x>=0&&dp[sum-x]==1)) printf("YES
"); else printf("NO
"); } } } return 0; }

좋은 웹페이지 즐겨찾기