HDU5543
来源:互联网 发布:matlab如何编程 编辑:程序博客网 时间:2024/05/16 11:14
Problem: Pick The Sticks
Source: The 2015 China Collegiate Programming Contest
Description: 一个人用长度为L的容器装金条,每条金条有自己的长度和自己的价值。装金条的时候只要金条的重心在容器中那么就可以装,现在问你这个人最多能装走多少价值的黄金。
Solution: 如果没有题目描述中加粗的条件,那么这个问题就是一个
Code(C++):
#include <stdio.h>#define MAX(a,b) ((a)>(b)? (a):(b))const int M=4000+5;const int E=1000+5;typedef long long LL;typedef struct tagNode{ LL len; LL w; tagNode(){} tagNode(int _len,int _w): len(_len),w(_w){}}Node;int n;LL L;LL dp[M][3];Node nodes[E];int main(){ int N,K=1; for(scanf("%d",&N);N--;){ scanf("%d%I64d",&n,&L); L<<=1; LL l,w; LL tmp_max=0; for(int i=0;i<n;i++) scanf("%I64d%I64d",&l,&w), l<<=1, nodes[i]=Node(l,w), tmp_max=MAX(tmp_max,nodes[i].w); //if(n==1){ // printf("Case #%d: %I64d\n",K++,nodes[0].w); // continue; //} for(int i=0;i<M;i++) for(int j=0;j<3;j++) dp[i][j]=0; for(int i=0;i<n;i++) for(int j=L;j>=nodes[i].len/2;j--) for(int k=0;k<3;k++){ if(j>=nodes[i].len) dp[j][k]=MAX(dp[j][k],dp[j-nodes[i].len][k]+nodes[i].w); if(k) dp[j][k]=MAX(dp[j][k],dp[j-nodes[i].len/2][k-1]+nodes[i].w); } LL ans=MAX(MAX(tmp_max,dp[L][0]),MAX(dp[L][1],dp[L][2])); printf("Case #%d: %I64d\n",K++,ans); } return 0;}
0 0
- HDU5543
- HDU5543-Pick The Sticks
- HDU5543(97/600)
- hdu5543(01背包)
- hdu5543(01背包变换)
- HDU5543 Pick The Sticks(01背包)
- HDU5543 Pick The Sticks [背包dp变形]
- 2015 南阳CCPC hdu5543 Pick The Sticks(01背包)
- HDU5543——Pick The Sticks(动态规划)
- HDU5543 Pick The Sticks(01背包变种,dp)(2015CCPC)
- 【HDU5543 2015 CCPC 南阳国赛D】【贪心+DP】Pick The Sticks 木棍重心放在容器内 贪心法+三维状态直接法
- HDU3926 Hand in Hand(并查集)
- CentOS-6.3安装配置Tomcat-7
- 职场面试:如何快速提升你的通过率?
- hdu 1556 树状数组(区间更新,单点求和)
- Java 集合类
- HDU5543
- hibernate 用原生sql多表查询 ,字段名重复会被覆盖
- socket即时通讯
- Linux驱动之设备模型(1)
- Android.mk 语法
- Android中解析XML
- Java:比较运算符compareTo()、equals()、==之间的区别与应用总结
- OpenStack 性能测试项目Rally 部署
- fedora23搭建samba-server