题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1013

大三了,准备刷一下动态规划,保持思维的灵活性,这一次从zoj刷起,一道道刷,今天是9月29日,这是第一道。

这一道题目很长,题意:有n辆车,有三种材料,每种材料有独特的两种属性w,s,和一种防御值,按照题意,取几个组合可以形成一个comb,获得组合防御值(原先的不算了),每辆车也有w,s限制,求最大的防御值(所有材料每个小于500)

这道题有两个限制条件w,s,很容易想到二维背包,但是有三种材料,如果f[i][w][s]取得是防御值的话,那么组合,材料选取,情况将很复杂,然而组合的和每辆车的情况无关,只和总情况有关,所以定义f[i][j][k]为前i辆车取了j个头盔,k个铠甲时最大可取的靴子数量,先把所有可能情况dp统计出来,因为数据范围比较小,材料小于500,相当于带减枝的搜索。

可以使用滚动数组节省空间,转移方程f[i][j+k1][k+k2]=max(f[1-i][j][k]+cal(i,k1,k2)),转移时因为最大可取的靴子数为0也是合法的一种情况,所以我们需要把不合法(或者初始不确定情况)定义为-1;

这道题的关键在于状态的定义,滚动数组也熟悉了使用了一下。

130ms

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int w1,s1,c1,w2,s2,c2,w3,s3,c3,g1,g2,g3,all,n;
struct big
{
int w,s;
}hh[];
int f[][][]; void read()
{
cin>>w1>>s1>>c1;
cin>>w2>>s2>>c2;
cin>>w3>>s3>>c3;
cin>>g1>>g2>>g3>>all;
for(int i=;i<n;i++)
{
cin>>hh[i].w>>hh[i].s;
}
} void solve()
{
memset(f,,sizeof(f));
int ans1=,ans2=,ans=;
for(int k=;k<n;k++)
{
int ansx=ans1;
int ansy=ans2;
memset(f[ans],-,sizeof(f[ans]));
for(int i=;i<=ans1;i++)
{
for(int j=;j<=ans2;j++)
{
if(f[-ans][i][j]!=-)
{
for(int k1=;k1*w1<=hh[k].w&&k1*s1<=hh[k].s;k1++)
{
int t1=hh[k].w-k1*w1;
int t2=hh[k].s-k1*s1;
for(int k2=;k2*w2<=t1&&k2*s2<=t2;k2++)
{
int tt=min((t1-k2*w2)/w3,(t2-k2*s2)/s3);
f[ans][i+k1][j+k2]=max(f[ans][i+k1][j+k2],f[-ans][i][j]+tt);
ansx=max(ansx,i+k1);
ansy=max(ansy,j+k2);
}
}
} }
}
ans1=ansx;
ans2=ansy;
ans=-ans;
}
ans=-ans;
int res=;
for(int i=;i<=ans1;i++)
for(int j=;j<=ans2;j++)
{
int xx=f[ans][i][j];
if(xx==-)
continue;
if(g1*c1+g2*c2+g3*c3>=all)
{
res=max(res,i*c1+j*c2+xx*c3);
}
else
{
int yy=min(i/g1,min(j/g2,xx/g3));
res=max(res,yy*all+(i-yy*g1)*c1+(j-yy*g2)*c2+(xx-yy*g3)*c3);
}
}
printf("%d\n",res);
}
int main()
{
//freopen("input.txt","r",stdin);
int cas=;
while(cin>>n&&n)
{
if(cas>)
puts("");
printf("Case %d: ",cas++);
read();
solve();
}
}

zoj1013 Great Equipment的更多相关文章

  1. Equipment Box[HDU1110]

    Equipment Box Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. HDOJ 3177 Crixalis&#39;s Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. HDU ACM 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. 杭电 3177 Crixalis&#39;s Equipment

    http://acm.hdu.edu.cn/showproblem.php? pid=3177 Crixalis's Equipment Time Limit: 2000/1000 MS (Java/ ...

  5. Hdu 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. /Home/Tpl/Equipment/rangeIndex.html 里调用魔板

    <pre name="code" class="html">demo:/var/www/DEVOPS# vim ./Home/Tpl/Equipme ...

  7. HDU 3177 Crixalis&#39;s Equipment(贪婪)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=3177 Problem Description Crixalis - Sand King used t ...

  8. Equipment UVA - 1508(子集补集)

    The Korea Defense and Science Institute, shortly KDSI, has been putting constant effort into newequi ...

  9. UVA 1508 - Equipment 状态压缩 枚举子集 dfs

    UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...

随机推荐

  1. Ror初学笔记

    Ror正在以惊人的速度增长着,特别是在常常光顾JavaEye的时候发现Ror已经在国内有非常好的基础了,当然要凑个热闹尝尝鲜 咯. 眼下国内Ror的中文资料还是非常少的,到网上找找就仅仅有Eiffel ...

  2. Parallels destop8 无法创建bootcamp虚拟机

    创建基于Boot Camp的虚拟机时弹出“PRL_ERR_DISK_FILE_OPEN_ERROR (0x80021014)”错误提示,由于Mac系统权限错误或Boot Camp内Windows系统权 ...

  3. 使用javascript oop开发滑动(slide) 菜单控件

    这里使用原生的javascript,用面向对象的方式创建一个容易维护使用方便的滑动菜单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...

  4. 使用float属性布局时父元素高度不能自适应的解决方法

    在网页的布局过程中,经常会用到float属性来实现页面的左右布局,但是有个问题就是父元素的高度并不能根据子元素的高度自适应.比如下面这段代码: <!DOCTYPE html> <ht ...

  5. DataTable转换为LIST

    public List<string[]> SetList(DataTable dt)        {            List<string[]> list = ne ...

  6. JS如何将UTC格式时间转本地格式

    Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month & ...

  7. 使用微信 SDK 上传图片到七牛

    总体思路是:在微信下选好图片后将图片上传到微信服务器,在后端使用微信服务器返回的图片 serverId 加上调用接口的 ApiTicket 通过七牛的 fetch 接口向微信服务器下载多媒体文件的接口 ...

  8. 修改已经提交到远端的git commit信息

    有这么一种场景,就是以前没有设置用户名和邮箱,导致提交时git commit信息中用户信息不正确.这样的情况导致后来我们提交代码到git上面时因为身份验证错误,只有到 push 阶段了才发现提交不上去 ...

  9. 关于Eclipse的编码配置和字体大小设置

    编码设置 1.工作空间编码:Window-->Preferences-->General-->Workspace 2.工程文件编码:项目-->Properties-->R ...

  10. 使用SecureCRT网络连接树莓派

        为了更加方便可以通过网络来连接.控制树莓派,使用SecureCRT可以通过网络来连接树莓派.     1.在树莓派上通过终端命令ifconfig 来查看当前树莓派的IP地址:     IP地址 ...