USACO--2.1Subset Sums

开始的时候,用dfs去做,结果果断超时;后面看了一下,原来就是一个0--1背包的变形题。

代码如下:

/*
ID: 15674811
LANG: C++
TASK: subset
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;

int main()
{
         ///ofstream cout("subset.out");
         ///ifstream cin("subset.in");
         long long V[700];   ///答案的最大值超过了int的范围
         int n;
         while(cin>>n)
         {
               int sum=0;
               for(int i=1;i<=n;i++)
                    sum+=i;
               if(sum%2)
               {
                       cout<<"0"<<endl;
                       continue;
               }
               sum=sum/2;
               memset(V,0,sizeof(V));
               V[0]=1;
                for(int i=1;i<=n;i++)
                    for(int j=sum;j>=i;j--)
                    {
                          V[j]+=V[j-i];
                    }
                cout<<V[sum]/2<<endl;
         }
   return 0;
}
时间: 2024-10-08 18:18:44

USACO--2.1Subset Sums的相关文章

【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 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&

usaco Subset Sums

题意是将1到N的N个数分为两组,要求这两组数字和相等,问有多少种分法 第一遍暴力超时,后来在网上找了才知道是dp,然后这道题的dp方程和01背包有点像,dp[i][j]=dp[i-1][j]+dp[i-1][j-N]; 方程的意思是在i个数字里选出总和为j的方案数,等于在i-1个数里,选出总和为j的方案数(没有i),加上在i-1个数里选出总和j-i的方案数(再加上后来的i,就等于j). 因为返程和01背包很像,所以也能使用和01背包一样的方法优化空间 /* ID: modengd1 PROG:

USACO Section 2.2 Subset Sums

/* ID: lucien23 PROG: subset LANG: C++ */ #include <iostream> #include <fstream> using namespace std; int main() { ifstream infile("subset.in"); ofstream outfile("subset.out"); if(!infile || !outfile) { cout << "

USACO 2.2 Subset Sums 集合(subset)

http://zhan.renren.com/000915?gid=3602888498063658248&checked=truehttp://zhan.renren.com/000915?gid=3602888498063658247&checked=truehttp://zhan.renren.com/000915?gid=3602888498063658246&checked=truehttp://zhan.renren.com/000915?gid=36028884980

USACO 2.2 Subset Sums 【经典的方案DP+必要的转化】

题目在这里:https://www.luogu.org/problem/show?pid=1466#sub 1.把一个连续正整数集合平分,假设该正整数集合和为s,那么平分后的两个集合和均为s/2,因此我们首先把s是奇数的n排除掉 2.接着,我们发现:平分集合方案数======>用n个数凑s/2的方案数======>DP 3.若用f[i][j]表示用前i 个数凑j 的方案,则 f[i][j]=f[i-1][j]+f[i-1][j-i] (1<=i<=n,0<=j<=s/2

USACO Section2.1 Subset Sums 解题报告 【icedream61】

subset解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 把1~N分成两组,让他们的和相等,请问这样的分组有多少种? 但顺序可以颠倒,比如{3}.{2,1}和{2,1}.{3}算作一种.[数据范围] 1<=N<=39[输入样例] 7[输出

USACO/fence8 迭代加深搜索+剪枝

题目链接 迭代加深搜索思想. 枚举答案K,考虑到能否切出K个木头,那么我们当然选最小的K个来切. 1.对于原材料,我们是首选最大的还是最小的?显然,首选大的能够更容易切出,也更容易得到答案. 2.对于目标木头,我们是优先得到最大的还是最小的?显然,由于K个木头我们都要得到,那么当然先把最大的(最难得到的)先得到,这种搜索策略更优. 3.假设总原材料为all,前K个木头总和为sum,那么all-sum就是这一次切割过程中能[浪费]的最大数目.对于一个切剩下的原材料,若它比最小的目标木头还要小,则它

POJ3187Backward Digit Sums[杨辉三角]

Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6350   Accepted: 3673 Description FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum ad