最大借书量问题

问题描述(注:该题目来自作者改编)

假设某图书馆成立10周年,为回馈VIP会员用户,设计了一个优惠活动:从纪念日起的连续的N天,VIP用户每天可免费借一定数量(由图书馆系统随机生成[1...M]之间的随机数)的书籍。同时,图书馆还有一个规定,如果某用户在第i天享受了借书优惠,那么在第i+1天不能再享受,至少要在第i+2天才能继续享受此优惠活动。

以N=7,M=10为例,某VIP用户抽到的一张优惠卡,主要信息如下:

则该用户在第一、四、七这三天去借书可以接到获得最大的借书量,为23本。

分析:

对于图书馆规定的不能在相邻两天借书,实际上等价于如下的限定条件:如果想在第i天借书,那么在第i-1天(或有)不能借书;同时,在第i+1天(或有)也不能借书。

分析其是否具有最优子结构性质,考虑问题规模为n的最大借书量C(n),如果在第n天不借书,必然是因为在第n-1天借了书,那么C(n)必然等于C(n-1);如果在第n天借书,那么C(n)必然等于C(n-2)加上第n天的免费借书量,最后C(n)只需要取这两种情况的最大值即可。第n天借与不借就是一个0-1决策问题,决策后,原问题的解可由子问题C(n-1)或者C(n-2)求解得到。

很容易得到该问题的递推关系(或者说所谓的状态转移方程):

算法实现:

package agdp;
public class Books {
    public static int getMostBooks(int[] b) {//为方便计算,b数组的首项b[0]用0填充,无实际意义
        int length = b.length;
        if(length == 1){return 0;}
        int[] aux = new int[length];//辅助数组,存储子问题的解
        aux[1] = b[1];
        for (int i = 2; i < length; i++) {
            aux[i] = Math.max(aux[i-2]+b[i], aux[i-1]);//对应的在第i天借书或者不借书
        }
        return aux[length-1];
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] ary = {0,5,1,2,10,6,2,8};
        int result = getMostBooks(ary);
        System.out.println(result);
    }
}
时间: 2024-08-02 03:36:15

最大借书量问题的相关文章

请设计一套图书馆借书管理系统的数据库表结构

请设计一套图书馆借书管理系统的数据库表结构:可以记录基本的用户信息.图书信息.借还书信息:数据表的个数不超过6个:请画表格描述表结构(需要说明每个字段的字段名.字段类型.字段含义描述): 在数据库设计中应: 1.保证每个用户的唯一性: 2.保证每种图书的唯一性:每种图书对应不等本数的多本图书:保证每本图书的唯一性: 3.借书信息表中,应同时考虑借书行为与还书行为,考虑借书期限: 4.保证借书信息表与用户表.图书信息表之间的参照完整性: 5.限制每个用户最大可借书的本数 6.若有新用户注册或新书入

jsoup抓取借书记录

1 package tushuguan; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.HashMap; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Set; 9 10 import org.apache.http.Header; 11 import org.apache.http

实战小项目之借书系统

项目简介 基于Qt做了一个用户管理和借书系统,主要是为了练手,学了mysql而不是白学,通过这个小软件,对数据库增删改查操作更为熟悉,对于操作失败时,能通过一些返回信息判断错误原因,不废话了,下面是这个小项目的组成: 用户管理 图书管理 借书系统 主界面 借书界面 图书管理界面 完整工程 https://github.com/tla001/PowerSystemV1

学生借书查询

USE BOOK GO SELECT 学生编号=stuID, 学生姓名=(SELECT stuName FROM dbo.STUDENT WHERE stuID = dbo.Borrow.stuID), 图书编号=BID, 图书名称=(SELECT Title FROM dbo.BOOK WHERE BID=dbo.Borrow.BID), 借出日期=T_time FROM dbo.Borrow WHERE stuID IN (SELECT stuID FROM dbo.STUDENT WHER

SQL常见面试题(借书卡表_图书表_借书记录表)

问题描述: 本题用到下面三个关系表: CARD 借书卡:          CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书:           BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数 BORROW 借书记录:  CNO 借书卡号,BNO 书号,RDATE 还书日期 备注:限定每人每种书只能借一本:库存册数随借书.还书而改变. 要求实现如下15个处理: 1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引

回忆我的大学——大学图书馆借书记录

回忆我的大学——大学图书馆借书记录 大四学年(人生有时候必须选择) 单片机系统的PROTEUS设计与仿真 1366663 B1206673 2009-6-3 19:30:38 借书 曾国藩,血祭 809063 B0637860 2009-5-29 17:23:11 借书 李自成.第五卷 701985 B0178241 2009-5-22 20:24:30 借书 李自成.第五卷 701979 B0177977 2009-5-18 18:25:16 借书 李自成.第四卷 701977 B017781

java学习之借书系统

实现的图书借阅系统要处理用户输入的非法参数,并引导用户正确使用 测试结果: 主要目的就是练习异常处理中的Exception类的使用 使用的相关语法 1 try{ 2 //可能产生异常的代码块 3 }catch(Exception e){ 4 //处理异常的代码块 5 }finally{//可以根据需要选择 6 //最终执行的代码块 7 } 实现过程: 创建BorrowBook类 import java.util.InputMismatchException; import java.util.S

实验11-07 查询“操作系统”的所有借书记录

请在Exam数据库中查询“操作系统”的所有借书记录. select * from Exam..borrow where bno in ( select distinct bno from Exam..book where bname = '操作系统' ) 原文地址:https://www.cnblogs.com/masterchd/p/9330922.html

JAVA程序设计(14.3)----- 图书馆管理系统 初步设计 界面篇~借书目录查看窗口,新书添加窗口

1.就地实例化,表格,表格滚动条,有滚动条自动出现抬头,表格model 2.新增窗口,上下调节的输入框,这种输入框中的数据获取方法,输入框部件设置,重置输入框内容 注意与主窗口通用一个BookManager--刚开始就因为在此窗口new了一个manager弄死加不进去--还不会报错---- 1 的代码先是主窗口   可以显示所有藏书 按钮2个 新增和删除  只做好了新增的 package com.lovo.ui; import java.awt.BorderLayout; import java