一道状压题,但今天闲来无事又用遗传乱搞了一下。

  设了一个DNA数组,DNA[i]记录第i个物品放在哪个组里。适应度是n-这个生物的组数+1.

  交配选用的是轮盘赌和单亲繁殖——0.3的几率单点变异。(事实上有性生殖我似乎写不出来……代码量略大)

  种群大小开到了400,在vijos上繁殖了2050代,下数据自己测也是对的。

然而只有84分

  这究竟是为什么啊    下数据自己测是没错的啊………………

  疯了

  代码和数据先放到这里,以后再改吧

  

#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctime> inline double random(double from,double to){
return rand()*1.0/RAND_MAX*(to-from)+from;
} inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n;
int w[],W;
int ans=0x7fffffff; struct Creative{
int DNA[],s[];
int cnt,score;
Creative(){ cnt=;score=; memset(s,,sizeof(s)); }
Creative Create(){
Creative New;
for(register int i=;i<=n;++i){
if(New.cnt==||random(,)<=0.5){
New.cnt++;
New.DNA[i]=New.cnt;
New.s[New.cnt]+=w[i];
}
else{
int j,tot=;
Label:
tot++;
j=random(,New.cnt);
if(New.s[j]+w[i]>W&&tot<=n*) goto Label;
if(!New.s[j]&&tot<=n+) goto Label;
if(tot>=n*){
New.cnt++;
New.DNA[i]=New.cnt;
New.s[New.cnt]+=w[i];
continue;
}
New.DNA[i]=j;
New.s[j]+=w[i];
}
}
if(New.cnt) ans=std::min(ans,New.cnt);
New.score=n-New.cnt+;
return New;
}
}; struct Biome{
Creative e[];
int tot;
void Clear(bool flag){
tot=;
for(int i=;i<;++i){
if(flag) e[i]=e[i].Create();
if(e[i].cnt) tot+=e[i].score;
if(e[i].cnt==) i--;
}
}
int Find(){
int sum=,limit=random(,tot);
for(register int i=;i<;++i){
sum+=e[i].score;
if(sum>=limit) return i;
}
return ;
}
Creative Multi(int x){
Creative New=e[x];
if(random(,)>0.3) return New;
int i=random(,n+),pos=New.DNA[i];
New.s[pos]-=w[i];
if(!New.s[pos]){
New.cnt--;
New.score++;
}
int j,tot=;
Label:
tot++;
j=random(,n);
if(New.s[j]+w[i]>W&&tot<=n*) goto Label;
if(!New.s[j]&&tot<=n+) goto Label;
if(tot>=n*){
New.cnt++;
New.DNA[i]=New.cnt;
New.score--;
New.s[New.cnt]+=w[i];
}
else{
New.DNA[i]=j;
if(!New.s[j]){
New.cnt++;
New.score--;
}
New.s[j]+=w[i];
ans=std::min(ans,New.cnt);
}
return New;
}
}Old,New; inline bool cmp(Creative a,Creative b){ return a.score>b.score; } int main(){
srand(time(NULL));
n=read(),W=read();
for(int i=;i<=n;++i) w[i]=read();
Old.Clear();
for(register int T=;T<=;++T){
Old.Clear();
for(register int i=;i<;++i) New.e[i]=Old.Multi(Old.Find());
std::sort(Old.e+,Old.e+,cmp);
std::sort(New.e+,New.e+,cmp);
for(register int i=;i<=;++i) Old.e[+i]=New.e[i];
}
/*for(int i=1;i<=100;++i,printf("\n")){
for(int j=1;j<=n;++j) printf("%d ",Old.e[i].DNA[j]);
printf(">>>%d %d",Old.e[i].cnt,Old.e[i].score);
}*/
printf("%d",ans);
return ;
}

18 100000000
37597832
24520955
100000000
18509980
29141223
20287969
14028193
33097076
12116817
53439913
10216168
32891936
43952038
13463011
4056577
4646046
10153053
37881213

下一个准备用遗传搞的题是猫狗大战。

【Luogu】P3052摩天大楼里的奶牛(遗传算法乱搞)的更多相关文章

  1. 【Luogu】P3052摩天大楼里的奶牛(状压DP)

    参见ZHT467的题解. f[i]表示在i这个集合下的最少分组数和当前组最少的容量. 从1到(1<<n)-1枚举i,对于每个i枚举它的子奶牛,然后重载运算符计算. 代码如下 #includ ...

  2. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛 [迭代加深搜索]

    题目传送门 摩天大楼里的奶牛 题目描述 A little known fact about Bessie and friends is that they love stair climbing ra ...

  3. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...

  4. [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    洛谷题目链接:[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...

  5. 【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper

    迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A ...

  6. LUOGU P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...

  7. P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a spa ...

  8. 洛谷 P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...

  9. P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 状压dp

    这个状压dp其实很明显,n < 18写在前面了当然是状压.状态其实也很好想,但是有点问题,就是如何判断空间是否够大. 再单开一个g数组,存剩余空间就行了. 题干: 题目描述 A little k ...

随机推荐

  1. JS小游戏

    捕鱼达人 飞机大战游戏 详解javaScript的深拷贝 http://www.cnblogs.com/penghuwan/p/7359026.html

  2. 如何设置文件审计软件FileAudit的浏览选项

    FileAudit允许用户从审计访问事件中排除掉某些特定事件,用户可以把对于自身来说不敏感的文件审计访问事件设定在这些派出范围之类,这样一来就FileAudit就会自动过滤掉这些不明感时间,以便节约用 ...

  3. Install your Application into RaspberryPi2 and automatically start up

    如何安装和卸载应用程序到RaspberryPi2? 如何配置应用程序在RaspberryPi2开机后自动启动? How to install your app into RaspberryPi2? H ...

  4. PHP 哈希表碰撞攻击

    理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内定位到一个桶(术语bucket,表示哈希表中的一个位 ...

  5. C++实现动态数组

    实现一个动态数组,要求对于随机访问可以在常数时间完成,可以通过push_back向数据的尾部追加元素,可以通过pop_back删除尾部元素,能够满足常见的数组操作. LINE 2016年春招笔试   ...

  6. poj1142Smith Numbers质因子分解

    题意:一个数不是质数,其质因子的每位加起来等于该数的每位加起来. /* 题意:一个数的所有质因子的每位相加起来等于该数的每位相加起来且该数不能是质数,那么就是史密斯数 tip:对于分解质因子,只需要判 ...

  7. Kubernetes介绍与特性

    1.Kubernetes 是什么 简单的来说,k8s可以理解为,一个容器平台,一个微服务平台,便携式云平台,我们那可以很快速的搭建一个服务,快速的运行起来 2.Kubernetes特性

  8. ThinPHP5.0 目录结构

    官网文档  https://www.kancloud.cn/manual/thinkphp5/118008 project 应用部署目录├─application 应用目录(可设置)│ ├─commo ...

  9. 关于img

    为img添加属性max-width min-height之类的属性可以对图片溢出部分实行自动裁剪功能 非常方便!!!!!!!!!(仅适用于那些原始图片大于max-width,max-height的图片 ...

  10. 用函数创建对象、类创建对象,以及使用prototype的好处

    用函数创建对象 var CheckObject = function(){}; CheckObject.checkName = function(){ // 检验姓名 }; CheckObject.c ...