博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
p1846
阅读量:5364 次
发布时间:2019-06-15

本文共 891 字,大约阅读时间需要 2 分钟。

背包两联发...

这道题看上去和前一题相似,也是组合后求最值.依然可以开三位数组flag[i][f][j]表示该状态能否到达.然后跑20*2000*2000*2000.这样复杂度看来搞不了.考虑如何优化.

这道题和上一题不一样的地方在于:每个宝藏必须分给某个人.也就是说,对于第k个宝藏必须要求i+f+j==宝藏总大小才可以到达.这样我们可以减少一维了.

flag[f][j]表示第一个人f个第二个人j个的状态能否达到.刚开始当然flag[0][0]可以达到.然后对于每个宝藏t,如果flag[f][j]==1,那么flag[f+t][j]=flag[f][j+t]=flag[f][j]都能等于1.这三个式子分别表示t给第一二三个人的状态转移.

最后对于所有flag[f][j]=1的情况都可以拿来更新状态:ans=min(ans,max(f,max(j,sum-f-j)).

复杂度20*2000*2000不用优化.

int i,f,j,t,sum,ans;int flag[2010][2010],n;int main(){    flag[0][0]=1;    n=read();    for(i=1;i<=n;i++)    {        t=read();        for(f=sum;f>=0;--f)            for(j=sum;j>=0;--j)                if(flag[f][j])                    flag[f+t][j]=flag[f][j+t]=1;        sum+=t;    }    ans=sum;    for(f=0;f<=sum;++f)        for(j=0;j<=sum;++j)            if(flag[f][j])                ans=min(ans,max(f,max(j,sum-f-j)));    cout<

 

转载于:https://www.cnblogs.com/qywyt/p/9988259.html

你可能感兴趣的文章
一个控制台程序,模拟机器人对话
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
解决响应式布局下兼容性的问题
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
[工具] Sublime Text 使用指南
查看>>
Web服务器的原理
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
HAL层三类函数及其作用
查看>>
web@h,c小总结
查看>>
Data Structure 基本概念
查看>>
NEYC 2017 游记
查看>>