专题三--1017

题目

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?

Input

The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.

Output

One integer per line representing the maximum of the total value (this number will be less than 231).

Sample Input

1
5 10
1 2 3 4 5
5 4 3 2 1

Sample Output

14

思考过程

这是一个01背包的模板题。

只要找出状态转移方程就解决了一大半问题。

这个问题我使用了一维数组进行了空间优化,因为题目给的数据的范围是N<=1000;V<=1000。所以需要开一个1000*1000的二位数组,这个数组太大了,超出了题目要求的范围,所以我使用了一个一位数组进行数组滚动。

状态转移方程为:

F[v]=max{ F[v-Ci]+Wi , F[v] }

需要特别注意的一个问题是,由于01背包问题需要比较的是上一个循环中F[v-Ci]+Wi , F[v]的值,因此需要递减循环F[v]

做题期间出现了一个小插曲,我写完之后提交三次,全部WA,全部绿,整的我脸都绿了。仔细检查代码后一点问题也没有,回头看题目才发现自己将题目中的数据顺序看错。。以后我一定要写一篇论文,名字就叫做《论ACM中英语与仔细读英语题目的重要性》。。

AC代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int v[1010];
  6. int c[1010];
  7. int dp[1010];
  8. int MAX(int a, int b){
  9. return a > b ? a : b;
  10. }
  11. int main(){
  12. int T, N, V;
  13. cin >> T;
  14. while (T--){
  15. scanf("%d%d", &N, &V);
  16. for (int i = 1; i <= N; i++){
  17. scanf("%d", &c[i]);
  18. }
  19. for (int j = 1; j <= N; j++){
  20. scanf("%d", &v[j]);
  21. }
  22. for (int i = 0; i <= 1000; i++){
  23. dp[i] = 0;
  24. }
  25. for (int k = 1; k <= N; k++){
  26. for (int l = V; l >=v[k]; l--){
  27. dp[l] = MAX(dp[(l - v[k])] + c[k], dp[l]);
  28. }
  29. }
  30. printf("%d\n", dp[V]);
  31. }
  32. }

来自为知笔记(Wiz)

时间: 2024-08-26 05:36:12

专题三--1017的相关文章

分析Linux磁盘管理与文件系统专题三

1.前言 紧接着我的上一篇博客进行磁盘管理操作: http://zhangfengzhe.blog.51cto.com/8855103/1430531 我们已经对磁盘进行了分区,信息如下: [[email protected] ~]# fdisk -l /dev/sdb Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 5

[C# 网络编程系列]专题三:自定义Web服务器

转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到我们想要的网页,这个过程中浏览器只是一个客户端,浏览器(应用层应用程序)通过HTTP协议把用户请求发送到服务端, 服务器接受到发送来的HTTP请求,然后对请求进行处理和响应

UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)

?? 1. FormValidation(表单提交及验证标签) 1.1.  参数 属性名 类型 描述 是否必须 默认值 action string 表单提交路径 否 null formid string 表单唯一标示 是 formobj refresh boolean dialog为true时是否刷新父页面 否 true callback string 表单提交完成后的回调函数 否 null beforeSubmit string 表单提交前的处理函数 否 null btnsub string

搜索引擎算法研究专题三:聚集索引与非聚集索引介绍

搜索引擎算法研究专题三:聚集索引与非聚集索引介绍 聚集索引介绍 在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同.表只能包含一个聚集索引. 如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配.聚集索引比非聚集索引有更快的数据访问速度. 聚集索引通常可加快 UPDATE 和 DELETE 操作的速度,因为这两个操作需要读取大量的数据.创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组. 可考虑将聚集索引用于: 1.包含数量有限的唯一值的列,如 s

[.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern)

一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题作为一个准备专题,因为在后面一个专题中将会网上书店中的仓储实现引入规约模式.本专题将详细介绍了规约模式. 二.什么是规约模式 讲到规约模式,自然想到的是什么是规约模式呢?从名字上看,规约模式就是一个约束条件,我们在使用仓储进行查询的时候,这时候就会牵涉到很多查询条件,例如名字包含C#的书名等条件.这样就自然需要引入规约模式了.规约模式的作用可以自由组装业务逻辑元素

[Asp.net 开发系列之SignalR篇]专题三:使用SignalR实现聊天室的功能

一.引言 在前一篇文章中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然后每个在线用户可以加入这个房间里面进行群聊,我们可以为房间设置一个唯一的名字来作为标识.那SignalR类库里面是否有这样现有的方法呢?答案是肯定的. // IGroupManager接口提供如下方法 // 作用:将连接ID加入某个组 // Context.ConnectionId 连接ID,每个页

专题三、ArrayList遍历方式以及效率比较

一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: // 基本的forfor (int i = 0; i < size; i++){    value = list.get(i);} 2.第二种,foreach语句 foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. 代码如下: for (In

[Python学习] 专题三.字符串的基础知识

        在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础         字符串指一有序的字符序列集合,用单引号.双引号.三重(单双均可)引号引起来.如: s1='www.csdn.net'   s2="www.csdn.net"   s3='''aaabbb''' 其中字符串又包括: 1.转义字符串 像C语言中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,pyth

专题三 Problem1013

题目大意: 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.输入正整数n,输出在第n年的时候,共有多少头母牛? 解题思路: 这道题目乍一看挺简单的,但是我在做的时候因为粗心大意就犯了一个致命性的错误.我先计算了当n=1,2,3,4的时候的母牛值,因为此时只有一头母牛在生产,所以此时母牛书f=1,2,3,4.然而当我继续计算n=5的时候,第一次忘记了最开始生的那一头母牛这一年也到了生产的年龄,忘了加这一头母牛的,改了这个错误之后,在计算n=6的时候忘了老母牛