01背包 15CCPC D题
2015-11-07 19:53
260 查看
http://acm.uestc.edu.cn/#/problem/show/1218
首先01背包
FOR(i,1,n)
FOR(j,0,V)
FOR(i,1,n)
FOR(j,V,0)
首先01背包
FOR(i,1,n)
FOR(j,0,V)
dp[i][j] =max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
空间优化,用一维数组实现,dp[i]这个可以省略,注意第二层循环倒着来FOR(i,1,n)
FOR(j,V,0)
dp[j] =max(dp[j],dp[j-c[i]]+w[i]);
然后就是这道题的,特殊处理棍的两端=,=用dp[i][j][k]表示,k表示使用了0,1,2次两端dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-c[i]][k]+w[i],dp[i-1][j-c[i]/2][k-1]+w[i])
对棍长时奇数,所以所有长度都乘2#include <iostream> #include <algorithm> #include <cstring> #include <stdio.h> using namespace std; #define FOR(i,j,k) for(int i=j;i<=k;i++) #define ll long long struct nod { ll c; ll w; }nd[1010]; ll dp[4010][3]; ll max(ll a,ll b) { if(a>b) return a ; return b; } int main() { int T; scanf("%d",&T); FOR(z,1,T) { memset(dp,0,sizeof(dp)); int n,L; scanf("%d%d",&n,&L); L*=2; ll ma=0; FOR(i,1,n){ scanf("%lld%lld",&nd[i].c,&nd[i].w),nd[i].c*=2; ma=max(ma,nd[i].w); } FOR(i,1,n) for(ll j=L;j>=nd[i].c/2;j--) { for(int k=0;k<=2;k++) { if(k>=1) dp[j][k]=max(dp[j-nd[i].c/2][k-1]+nd[i].w,dp[j][k]); if(j>=nd[i].c) dp[j][k]=max(dp[j][k],dp[j-nd[i].c][k]+nd[i].w); } } dp[L][2]=max(dp[L][2],ma); printf("Case #%d: %lld\n",z,dp[L][2]); } return 0; }
相关文章推荐
- codeforce 402E (矩阵 & 强连通)
- android TextView 属性
- ZOJ 1610 Count the Colors(暴力或者线段树)
- Linux有问必答: 当使用代理服务器连接互联网时如何安装 Ubuntu 桌面版
- openssl中PKCS12_free函数的位置及实现方式
- [实战]MVC5+EF6+MySql企业网盘实战(14)——逻辑重构
- hdu 2732 Leapin' Lizards(最大流)Mid-Central USA 2005
- PHP反射教程
- 达内学习日志Day50:使用SpringMVC完成登录操作
- Java零散知识点总结
- explicit显示使用构造函数
- 《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型
- SQLite3中自增主键归零方法
- HDU 1175(连连看)
- GlusterFS的安装与使用
- IOS推送功能push
- 逆向物流平台用户管理模块需求说明书
- Redis高级特性:虚拟内存的使用技巧
- c++关键字详解(volatile, mutable, explicit, dynamic_ cast(expression))等
- Maven 手动添加 JAR 包到本地仓库