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

  设了一个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. SVN上传文件过程中出现错误“不知道这样的主机”

    在虚拟机中安装完成VisualSVN Server,并且在本地客户端也安装好了TortoiseSVN,在上传文件到服务器的过程中出现错误“不知道这样的主机”,如下图: 地址https://admin- ...

  2. c语言中的赋值

    int s,i,len,err=0 这个是只给err赋了值还是这四个都有?

  3. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} 解决方法

    Tomcat启动时出现红色警告内容 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'sour ...

  4. JBOSS连接池默认连接数是多少?在哪个配置文件有这个默认的连接数?

    如果你用的是是4.x的Jboss的话,请参考:docs/dtd/jboss-ds_1_0.dtd,相信你很容易就能找到控制最大/最小连接数的选项,应该是诸如:max-pool-size/min-poo ...

  5. Python之Mac Scrapy爬虫小记

    最近在尝试用Python爬虫,在装Scrapy的过程中遇到了一些麻烦. 上网搜索资料也未能解决command not found scrapy的报错. 最后我删除scrapy,用pip3.6 inst ...

  6. DatePicker 注意点 1.不用v-model 用:value 2.配合on-change进行回调 3.初始值 当天的用 (new Date()).toLocaleDateString().replace(/\//g, '-')

    <DatePicker :value="formData.date" type="date" format="yyyy-MM-dd" ...

  7. django 2.0 + pycharm2017 出现的问题

    在创建完成app之后,在models文件里创建两个类:BlogType , Blog, 创建超级用户,注册admin,在登陆admin之后发现,发现 BlogType , Blog,并没有导入到adm ...

  8. sql server 处理分母为空

    SP 前面加下面设置,会忽略错误结果 直接返回null 不会导致SP 失败 SET ANSI_WARNINGS OFFSET ARITHABORT OFFSET ARITHIGNORE ON

  9. java HttpServletRequest 重复流读取

    在用reset接口的时候,常常会使用request.getInputStream()方法,但是流只能读取一次,一旦想要加上一个过滤器用来检测用户请求的数据时就会出现异常.   在过滤器中通过流读取出用 ...

  10. ubuntu frp 自编译。本文不能按顺序来 请自己理解

    go run:go run 编译并直接运行程序,它会产生一个临时文件(但不会生成 .exe 文件),直接在命令行输出程序执行结果,方便用户调试. go build:go build 用于测试编译包,主 ...