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