TOJ3583A and B Problem

来源:互联网 发布:永久性脱胡须知乎 编辑:程序博客网 时间:2024/06/05 05:05

A and B Problem 分享至QQ空间 去爱问答提问或回答

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
Total Submit: 25            Accepted: 16

Description

相信你已经AC了A + B Problem,是不是很简单呢。

下面继续A and B Problem这个简单的问题,将若干个长度不同的木棍,分成A堆和B堆,并且保证A堆所有木棍的长度之和等于B堆所有木棍的长度之和。

Input

输入数据有多组。

每组测试数据第一行为一个正整数n(n<=100),代表总的木棍个数;

第二行为n个以空格隔开的正整数ci(ci<=100)。

Output

如果n根木棍可以分成两堆木棍(A堆和B堆),并且A堆所有木棍的长度之和等于B堆所有木棍的长度之和,则输出"Yes" ,否则输出"No"(A堆和B堆中的木棍个数不必相等)。

Sample Input

41 2 3 421 2

Sample Output

YesNo
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 110;bool vis[maxn];vector<int> v;int n, sum;bool result;bool cmp(const int& x, const int& y) {    return x < y;}void dp(int s) {    if(result) return;    if(s == 0) {        result = true;        return;    }    int i, Size = v.size();    for(i = Size-1; i >= 0; i--) {        if(!vis[i] && s >= v[i]) {            vis[i] = true;            dp(s-v[i]);//状态转移.            vis[i] = false;        }    }}void init() {    sum = 0;    v.clear();    result = false;    memset(vis, false, sizeof(vis));}int main(){    int i;    int tmp;    while(scanf("%d", &n) != EOF) {        init();        for(i = 1; i <= n; i++) {            scanf("%d", &tmp);            sum += tmp;            v.push_back(tmp);        }        sort(v.begin(), v.end(), cmp);        if(sum % 2 == 1) {            printf("No\n");            continue;        }        dp(sum/2);        if(result) printf("Yes\n");        else printf("No\n");    }    return 0;}
原创粉丝点击