UVa:10664 Luggage

题意:给你一些数,问你能不能分成两组使得每组和相同。

思路:数据量比较小可以用暴搜。如果数据量比较大要用DP。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int w[30];
int sum,n;
bool ok;
void dfs(int cur,int  _sum)
{
    if(_sum==sum-_sum) ok=true;
    if(ok) return;
    for(int i=cur;i<n;++i)
    {
        dfs(i+1,_sum+w[i]);
        dfs(i+1,_sum);
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        memset(w,0,sizeof(w));
        char c;
        n=0;
        sum=0;
        ok=false;
        while(scanf("%c",&c)==1)
        {
            if(isdigit(c))
                w[n]=w[n]*10+c-'0';
            else
            {
                sum+=w[n];
                n++;
                if(c=='\n')
                    break;
            }
        }
        dfs(0,0);
        if(ok)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}


你可能感兴趣的:(搜索)