问题标题: 酷町堂:1531 公正的比赛

0
0
已解决
储金洋
储金洋
新手光能
新手光能

求解题思路,注意,是解题思路,是解题思路,是解题思路!

题目描述 Description

在一场比赛中,由于进入决赛的A队和B队在比赛中实力相当,难以分出胜负,为了公平起见,最终评委决定将比赛的奖品平分给A、B两队。那么问题来了:现在有N个价值不同的奖品,须将N个奖品分成价值相同的两部分(颁奖给A、B两队),会有多少种分法?

输入描述 Input Description

输入为两行;
第一行输入整数N,表示有N个奖品;
第二行输入N个数,分别表示奖品的价值。

输出描述 Output Description

输出为一个整数;
若可以分为k种价值相同的两部分则输出k;若不存在价值相同的两部分则输出0;


2
已采纳
梁锦程
梁锦程
高级光能
高级光能

简单的01背包,输入后将数组累和;然除以2,再把第一个背包初始化f[0]=1;

for(int i=1;i<=n;++i)

for(int j=sum;j>=val[i];--j)

f[j]+=f[j-val[i]];

cout<<f[sum]/2<<endl;/*注意一定要/2输出,因为方案包括了分组的另一半*/

 

梁锦程在2018-02-24 13:31:21追加了内容

输出是要特判一下,上面输出是错的;

if(sum%2!=0)
    {
        cout<<0;
        return 0;
    }

else cout<<f[sum]/2;

0
0
梁锦程
梁锦程
高级光能
高级光能

刚刚的不准确,不好意思

我要回答