【USACO 2.2】Subset Sums (DP)

N (1 <= N <= 39),问有多少种把1到N划分为两个集合的方法使得两个集合的和相等。

如果总和为奇数,那么就是0种划分方案。否则用dp做。

dp[i][j]表示前 i 个数划分到一个集合里,和为j的方法数。

dp[i][j]=dp[i-1][j]+dp[i][j-i]

n 为 39 时,1 到 39 的和为 780,枚举 j 的时候枚举到 s/2,最后输出dp[n][s/2]/2。

http://train.usaco.org/usacoprob2?a=z5hb7MFUmsX&S=subset

/*
TASK: subset
LANG: C++
*/
#include<bits/stdc++.h>
int n;
int s,ans;
long long dp[100][1000];
int main(){
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)s+=i;
	dp[0][0]=1;
	if(s%2==0)
	for(int i=1;i<=n;i++){
		for(int j=0;j<=s/2;j++)
			dp[i][j]+=dp[i-1][j]+(j>=i?dp[i-1][j-i]:0);

	printf("%lld\n",dp[n][s/2]/2);
}

  

时间: 2024-10-24 18:35:27

【USACO 2.2】Subset Sums (DP)的相关文章

【USACO 1.1】你的飞碟在这儿

[问题描述] 一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO. 这些不明飞行物时常来收集来自在地球上忠诚的支持者. 不幸地,他们的空间在每次旅行只能带上一群支持者. 他们要做的是用一种聪明的方案让每一个团体人被慧星带走.他们为每个慧星起了一个名字,通过这些名字来决定一个团体是不是特定的慧星带走. 那个相配方案的细节在下面被给出: 你的工作要写一个程序来通过团体的名字和彗星的名字来决定一个组是否应该与在那一颗慧星后面的不明飞行物搭配. 团体的名字和慧星的名字都以下列各项方式转换成一个数字

【USACO 1.2】贪婪的送礼者

[题目描述] 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱. 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目. [输入格式] 第 1 行: 人数NP,2<= NP<=10 第 2

【USACO 1.3】黑色星期五

[问题描述] 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400. 这里有一些你要知道的: 1.1900年1月1日是星期一.2.4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.3.年份可以被4整除的为闰年(1992=4*498 所以 1992年是

【NOIP模拟题】Incr(dp)

太水的dp没啥好说的.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <vector> #include <map> usin

【NOIP模拟题】Permutation(dp+高精度)

首先我们可以这样想: 设状态f[i, j]表示1-i序列有j个'<'的方案数 那么考虑转移 因为i比i-1大,所以可以考虑从i-1来转移.首先i是要插入1-i-1这个序列的,所以我们可以思考插入的位置: 仔细推下可得: 当插入的位置原来是‘<'时,答案不会改变 当插入的位置原来是'>'时,答案会+1 当插入左边界时,答案不变 当插入有边界时,答案+1 那么我们知道了前i-1的'<'数量和'>'的数量那么就能转移了 f[i,j]=(j+1)*f[i-1, j]+(max{i-1

【USACO】Subset Sums(双向搜索 dfs)

给你一组数 1 ~ N,问你能有几种分法,把他们分成2组,2组的和相等. 如果 sum(1 ~ n) 为奇数,直接输出0,负责的话 主要找到 和为 sum / 2的组数 再除以2就是结果 因为N 最大为39 如果单向搜索肯定超时,改成双向的就行了 /* ID: 18906421 LANG: C++ PROG: subset */ #include<cstdio> #include<cstring> #include<iostream> #include<vecto

【USACO 2011 Open】修剪草坪(DP)

题目描述 在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠.然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作.FJ 有 N 只排成一排的奶牛,编号为 1...N.每只奶牛的效率是不同的,奶牛 i 的效率为 E_i.靠近的奶牛们很熟悉,因此,如果 FJ 安排超过 K 只连续的奶牛,那么,这些奶牛就会罢工去开派对:).现在 FJ 需要你的帮助,计算 FJ 可以得到的最大效率,并且该方案中没有连续的

【USACO 2012 Open】Running Laps(树状数组)

53 奶牛赛跑 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈之后,比赛就立即结束了.有时候,跑得快的奶牛可以比跑得慢的奶牛多绕赛场几圈,从而在一些时刻超过慢的奶牛.这就是最令观众激动的套圈事件了.请问在整个比赛过程中,套圈事件一共会发生多少次呢?输入格式? 第一行:三个整数 N, L 和 C, 1 ≤ N ≤ 105 , 1 ≤ L ≤ 25000 , 1 ≤ C

【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉

DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $  当然这里的$i$和$k$都是偶数啦~这个应该很好理解吧……每次喷灌的都是一个偶数长度的区间嘛…… 那么加上奶牛的喜欢区间的话,只需这样:当$ i>cow[j].x $时,令$ i=cow[j].y , j++$ 也就是说中间的位置全部不考虑放喷灌器. 显然我们对于每个节点的 k 是可以用单调队列维护的!嗯看到这里的同学可以先自己试着去