分析:就是不断递归寻找靠近边界的最优解

学习博客(必须先看这个):

1:http://www.cnblogs.com/autsky-jadek/p/3959446.html

2:http://blog.csdn.net/u013849646/article/details/51524748

注:这里用的最小乘积生成树的思想,和dp结合

每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树

这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优

#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 8e2+5;
typedef long long LL;
struct point{int x, y;point(int x=0,int y=0):x(x),y(y){}point operator -(const point &rhs)const{return point(x-rhs.x,y-rhs.y);}point operator +(const point &rhs)const{return point(x+rhs.x,y+rhs.y);}
};
LL cross(point a,point b){return 1ll*a.x*b.y-1ll*a.y*b.x;
}
int n,m,sum;
int a[N],b[N],c[N];
point p[N];
LL dp[N],f[N],ans;
point get(){p[0]=point(0,0),dp[0]=0;for(int i=1;i<=sum;++i)dp[i]=1LL<<60;for(int i=1;i<=n;++i){for(int j=sum;j>=a[i];--j){if(dp[j]>dp[j-a[i]]+f[i]){dp[j]=dp[j-a[i]]+f[i];p[j]=p[j-a[i]]+point(b[i],c[i]); }}}int ret=m;LL tot=1LL*p[ret].x*p[ret].y;for(int i=m+1;i<=sum;++i){if(dp[i]<dp[ret]||dp[i]==dp[ret]&&1ll*p[i].x*p[i].y<tot)ret=i,tot=1ll*p[i].x*p[i].y;}ans=min(ans,tot);return p[ret];
}
void solve(point A,point B){for(int i=1;i<=n;++i)f[i]=1ll*c[i]*(B.x-A.x)+1ll*b[i]*(A.y-B.y);point C=get();if(cross(B-A,C-A)>=0)return;solve(A,C);solve(C,B);
}
int main(){while(~scanf("%d%d",&n,&m)){sum=0;for(int i=1;i<=n;++i){scanf("%d%d%d",&a[i],&b[i],&c[i]);sum+=a[i];}ans=1LL<<60;for(int i=1;i<=n;++i)f[i]=b[i];point A=get();for(int i=1;i<=n;++i)f[i]=c[i];point B=get();solve(A,B);printf("%I64d\n",ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/shuguangzw/p/5634463.html

HDU5697 刷题计划 dp+最小乘积生成树相关推荐

  1. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  2. BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2135 是 hydro 的 BZOJ ...

  3. LeetCode LCP 12. 小张刷题计划(二分查找)

    1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注 ...

  4. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  5. 北邮oj题库刷题计划(更新ing)

    北邮oj题库刷题计划(更新ing) 83. A + B Problem 84 Single Number 85. Three Points On A Line 120 日期 121 最值问题 122 ...

  6. 力扣动态规划入门21天刷题计划(共计46题)

    刷题地址:https://leetcode-cn.com/study-plan/dynamic-programming/?progress=8e97f6 动态规划常常适用于有重叠子问题和最优子结构性质 ...

  7. 最小乘积生成树和最小乘积最大匹配

    两个知识的本质是一样的.都是每条边有k个权值(一般k为2),现在要取一个边集M使得其将所有点连通,并使每一种边权的总和的乘积最小.不同的是一个是生成树一个是匹配. 对于这一类问题,我们都可以把每种方案 ...

  8. P1926 小书童——刷题大军(dp背包(01背包)状态转移方程)

    题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...

  9. 关于leetcode刷题计划

    1.简单题目一天2-3: 2.中等题目一天1-2,: 3.困难题目一天1: ~~~每天刷题数目2-3,并写好总结,题目按tags分类,要cover到每个tag: ~~~每周抽1小时回顾一周得题目: ~ ...

最新文章

  1. 绝望,上传文件失败。。遇到并解决java.lang.NullPointerException
  2. Java中的Split方法不适用于一个句号
  3. zookeeper + kafka集群搭建详解
  4. linux ubuntu ssh,Linux(Ubuntu)安装ssh服务
  5. mysql cluster双机_GitHub - sophys/mysqlha: 博客“Mysql-cluster数据库集群双机HA研究”测试代码...
  6. 基于Python的开源人脸识别库,离线识别率高达99.38%
  7. mysqlreport
  8. mysql过滤效率和java过滤效率_熔喷布过滤效率测试仪详解
  9. ajax获取后生成元素,获取动态的子元素生成的内容与jQuery AJAX
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的线上电器商城
  11. sigaction介绍
  12. 零基础安装Ubuntu kylin 16.04 LTS 后应该做什么[本人安装目的:学习Python数据分析]
  13. 移动端布局:视口viewport的理解
  14. 关于前端学习和笔试面试的总结
  15. matlab机器人画圆轨迹规划
  16. 3D resnet根据UCF101数据集制作自己的数据集实现动作识别
  17. c++病毒代码(附源码)
  18. linux51单片机烧录程序,单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境...
  19. Incorrect string value: '\xF0\x9F\x98\x82' for column '' at row 1
  20. 在mips64架构的国产系统中安装pyinstaller

热门文章

  1. python学习笔记(七)
  2. expressjs路由和Nodejs服务器端发送REST请求 - - ITeye博客
  3. koa --- restful规范及其栗子
  4. PHP 安全编程建议
  5. ES6-14 Unicode表示法、字符串方法、模板字符串
  6. js中遍历注册事件时索引怎么获取
  7. 44. 源代码解读-RocketMQ-架构
  8. RPM方式安装MySQL5.6
  9. 软考信息系统监理师第五次作业
  10. [链接]Python中的metaclass、装饰器