hdu 5000 共存问题->背包
http://acm.hdu.edu.cn/showproblem.php?pid=5000
每只羊有n个属性
下面n个数字表示每个属性的值范围为[ 0, T[i] ]
对于羊圈里的a羊和b羊,若a羊的每个属性都>=b羊,则a羊会杀死b羊。
问羊圈里最多存活多少只羊。
sum相同的羊不会互相杀死。
sum不同的羊不会重合。(我们设a羊sum = x,b羊sum = y,若a,b羊能共存,但不会把ab同时放到羊圈里。
因为一定存在一只羊c ,sum = x,且c和b不能共存,既然不能共存,则我们放入c羊是不会影响答案的。)
sum其实是对称的,和组合数一样。所以dp[n][求和(T[i]) / 2] 是最大的。
要推出最大值的时候,每个人的属性和必然相同,并且这个和必然是所有和
/ 2,这样的话,问题转化为给n个数字,要组合成sum / 2有多少种方法,就用dp背包推一遍就可以得解了。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include<set>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
const int modo = 1e9 + 7;
int s[2004];
int dp[2004][1004];
int main() {
int _,n;
RD(_);
while(_--){
RD(n);
int sum = 0;
for(int i = 0;i < n;++i){
RD(s[i]);
sum += s[i];
}
sum /= 2;
clr0(dp);
for(int i = 0;i <= s[0];++i)
dp[0][i] = 1;
for(int i = 1;i < n;++i){
for(int j = 0;j <= sum;++j){
for(int k = 0;k + j <= sum && k <= s[i];++k)
dp[i][k+j] = (dp[i-1][j] + dp[i][k+j])%modo;
}
}
cout<<dp[n-1][sum]<<endl;
}
return 0;
}
hdu 5000 共存问题->背包的更多相关文章
- hdu 2546 典型01背包
分析:每种菜仅仅可以购买一次,但是低于5元不可消费,求剩余金额的最小值问题..其实也就是最接近5元(>=5)时, 购买还没有买过的蔡中最大值问题,当然还有一些临界情况 1.当余额充足时,可以随意 ...
- HDU 3127 WHUgirls(完全背包)
HDU 3127 WHUgirls(完全背包) http://acm.hdu.edu.cn/showproblem.php? pid=3127 题意: 如今有一块X*Y的矩形布条, 然后有n种规格的x ...
- 杭电1171 Big Event in HDU(母函数+多重背包解法)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 2639(01背包求第K大值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2639 Bone Collector II Time Limit: 5000/2000 MS (Jav ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- HDU 4003 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...
- HDU 1561 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...
- HDU 1011 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1011 题目大意:树上取点,先取父亲,再取儿子.每个点,权为w,花费为cost,给定m消费总额,求最大 ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
随机推荐
- 第一个struct2程序
[第1步] 安装Struts2 这一步对于Struts1.x和Struts2都是必须的,只是安装的方法不同.Struts1的入口点是一个Servlet,而Struts2的入口点是一个过滤器(Filte ...
- 给pyspark 设置新的环境
如果是从pysparkshell里面进去,此时已经有了pyspark环境了,所以要加一个:sc.stop() from pyspark import SparkContext, SparkConfsc ...
- ORA-10618: Operation not allowed on this segment 执行存储过程权限需声明
执行SHOW_SPACE存储过程时只能在DBA角色下成功,在NORMAL角色用户下报错: ORA-10618: Operation not allowed on this segmentORA-065 ...
- adb设置逍遥游
. adb设置模拟器属性imei.imsi.手机号.sim卡号2. adb设置充电模式3. 开启|关闭飞行模式4. 获取所有已安装程序apk路径和包名5. adb对指定设备执行指令6. 安装应用7. ...
- clion register
1. 使用 activation code 激活 安装完软件后,启动,在要求输入注册码的界面(菜单栏 ⇒ help ⇒ register)选择“License server”输入“http://ide ...
- 【校招面试 之 C/C++】第3题 为什么要内存对齐?以及内存对齐的方式
1.为什么要进行内存对? 参考:https://blog.csdn.net/a369000753/article/details/51188915 所谓内存对齐,是为了让内存存取更有效率而采用的一种编 ...
- swift中UITextView的使用
https://blog.csdn.net/potato512/article/details/52692604
- oracle使用 merge 更新或插入数据
OracleCC++C# 总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...
- Ubuntu12.04添加环境变量
环境变量分为系统级和用户级. 系统级变量设置环境为/etc/environment和/etc/profile等,不要轻易修改,否则可能造成系统错误. 用户级变量设置路径为-/.bashrc和~/.pr ...
- ubuntu关闭防火墙
https://jingyan.baidu.com/article/73c3ce283ee2c1e50343d9f6.html