对抗赛(线性动态规划常规模型)

【问题描述】

程序设计对抗赛设有 N(0<N≤50 的整数)个价值互不相同的奖品,每个奖品的价值分 别为 S1,S2,S3……Sn(均为不超过 100 的正整数)。现将它们分给甲乙两队,为了使得甲 乙两队得到相同价值的奖品,必须将这 N 个奖品分成总价值相等的两组。 编程要求:对给定 N 及 N 个奖品的价值,求出将这 N 个奖品分成价值相等的两组,共有 多少种分法?

例如:N = 5,S1,S2,S3……Sn 分别为 1,3,5,8,9 则可分为{1,3,9}与{5,8} 仅有 1 种分法;

例如:N = 7,S1,S2,S3……Sn 分别为 1,2,3,4,5,6,7

则可分为:

{1,6,7}与{2,3,4,5}

{2,5,7}与{1,3,4,6}

{3,4,7}与{1,2,5,6}

{1,2,4,7}与{3,5,6}

有 4 种分法。

【输入格式】

输入文件中包含 N 及 S1,S2,S3……Sn。(每两个相邻的数据之间有一个空格隔开)。

【输出格式】

输出文件包含一个整数,表示多少种分法的答案,数据若无解,则输出 0。

【输入样例】

7 
1 2 3 4 5 6 7

【输出样例】

4

 

#include<bits/stdc++.h>
using namespace std;
const int N = 10000000;
int  dp[N],s[N];
int main() {
	int n;
	cin >> n;
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		sum += s[i];
	}
	if (sum % 2 != 0) {
		cout << "0";
		return 0;
	}
	sum = sum / 2;
	dp[0] = 1;
	for (int i = 1; i <= n; i++) {
		for (int j = sum; j >= s[i]; j--) {
			dp[j] += dp[j - s[i]];
		}
	}
	cout << dp[sum] / 2;
	return 0;
}

  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值