hdu oj 5000 Clone DP
来源:互联网 发布:公安部网络监察局 编辑:程序博客网 时间:2024/06/05 11:17
看了一下别人的代码,这是一道01背包的变形。与01背包不同处是一个的值是确定的,一个的值是变化着的。
这道题是说这里有克隆人,克隆人有N个属性,如果存在一个克隆人的各个属性比另一个克隆人的相对应的属性都大,则另一个克隆人就要被杀死。现在给你N个属性值,求最多能有多少个克隆人存在。当其中的一个克隆人的一个属性为最大值,其他属性为0,为了保证该克隆人能继续存在,他的最大属性减小,另外的属性应该增大。通过实例说明,我们能发现当所有属性的和相等的情况下,属性和相等的克隆人是能共存的。现在要求能共存的克隆人达到最大,现在问题就是求属性和为多少时克隆人人数最大。采用极限法我们发现所有属性和的sum一半,即sum/2时,人数达到最大。dp[i][j+k]=(dp[i][j+k]+dp[i-1][j])%mod;表示当第i个属性为k时,前i个属性和为j+k时,前i-1个属性和为j的克隆人数+当前的已有值。
代码如下:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int mod=1e9+7;long long dp[2005][2005];int main() {int t,i,j,k,T[2005];scanf("%d",&t);while(t--) {int sum=0,n;memset(dp,0,sizeof(dp));scanf("%d",&n);for(i=1; i<=n; i++) {cin>>T[i];sum+=T[i];}if(n==1) cout<<1<<endl;else {sum/=2; memset(dp, 0, sizeof dp); for(i = 0; i <= T[1]; i++) dp[1][i] = 1; for(i = 2; i <= n; i++) { for(j = 0; j <= sum; j++) { for(k = 0; k + j <= sum && k <= T[i]; k++) { dp[i][k+j] = (dp[i][k+j] + dp[i-1][j]) % mod; } } } printf("%ld\n",dp[n][sum]);}}return 0;}
0 0
- hdu oj 5000 Clone DP
- HDU - 5000 Clone DP
- hdu 5000 Clone(dp)
- HDU 5000 Clone(背包dp)
- HDU 5000 Clone 规律+dp
- HDU 5000 Clone 猜想性质 DP
- hdu 5000 Clone (dp + 找规律)
- hdu-5000 Clone(DP+数学)
- HDU-5000 Clone 鞍山网络赛D题 DP+猜想
- 【DP】 HDOJ 5000 Clone
- HDU oj典型dp
- HDU 5000 Clone
- HDU 5000 Clone
- hdu 5000 Clone(背包)
- HDU 5000 Clone
- HDu 5000 Clone
- hdu 5000 Clone
- hdu 5000 Clone
- cocos2dx使用googlebreakpad收集崩溃日志
- 【转】SLF4J 的几种实际应用模式--之三:JCL-Over-SLF4J+SLF4J
- oracle学习笔记,待续~
- hdu 3342 Legal or Not
- RadiusNetwork iBeacon Library For Android 设备发现过程梳理
- hdu oj 5000 Clone DP
- 修改filesystemio_options 引起的故障
- UI 登陆界面的写法
- C#中自定义异常类
- UML的基本概念【类图关系 依赖、关联、泛化、实现】
- <Head First Java>学习笔记--第二章:类与对象
- QList介绍
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记12 Custom Views视图绘制1
- node.js 初体验