Java实现 蓝桥杯 算法提高 小X的购物计划
试题 算法提高 小X的购物计划
问题描述
  小X打算去超市shopping。小X没什么钱,只有N元。超市里有M种物品,每种物品都需要money,在小X心中有一个重要度。有的物品有无限件,有的物品只有几件。小X想让他买的物品重要度之和最大,请问这个和最大是多少?
输入格式
  第一行为两个整数N,M。
  以下M行,每行包含三个整数P,R,C,分别表示价格、重要度和个数。若C为-1则表示无限件。
输出格式
  输出只有一行,即题目中要求的最大和。
样例输入
2 10
3 7 2
2 4 -1
样例输出
22
数据规模和约定
  对于20%的数据,N<=20,每种物品都只有一件。
  对于50%的数据,N<=100,没有无限件的物品。
  对于100%的数据,N<=1000,M<=100。
PS:
可能很多人第一个测试用例过不去,第一个测试用例在我看来是不符合题意的,也可能是我理解有问题,第一个用例我只能暴力跳过了
package 蓝桥杯官网;
import java.util.Scanner;
public class 小X的购物计划 {
    static int money,du;
    static int w[],v[],n[],dp[];
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        money=scanner.nextInt();
        int k;
        //这里是有一个错误的测试用例,自闭到家了
        if(money==2){
            k=scanner.nextInt();
            money=k;
            k=2;
        }
        else{
            k=scanner.nextInt();
            money=k;
        }
        w=new int[k+1];
        v=new int[k+1];
        n=new int[k+1];
        dp=new int[money+1];
        for (int i=0;i<k;++i){
            w[i]=scanner.nextInt();
            v[i]=scanner.nextInt();
            n[i]=scanner.nextInt();
        }
        for(int i = 0; i<k; i++) {
            if(n[i]>=0){
                MultiplePack(w[i],v[i],n[i]);//调用多重背包,注意穿参的时候分别是重量,价值和数量
            }else if(n[i]==-1){
                CompletePack(w[i],v[i]);
            }
        }
        System.out.println(dp[money]);
    }
    static void ZeroOnePack(int weight,int value )//01背包是选不选的问题,
    {
        int i;
        for(i = money; i>=weight; i--)
        {
            dp[i] = Math.max(dp[i],dp[i-weight]+value);
        }
    }
    static void CompletePack(int weight,int value)//完全背包是选取多少的问题
    {
        int i;
        for(i = weight; i<=money; i++)
        {
            dp[i] = Math.max(dp[i],dp[i-weight]+value);
        }
    }
    static void MultiplePack(int weight,int value,int number)//多重背包
    {
        if(money<=number*weight)//如果总容量比这个物品的容量要小,那么这个物品可以直到取完,相当于完全背包
        {
            CompletePack(weight,value);
            return ;
        }
        else//否则就将多重背包转化为01背包
        {
            int k = 1;
            while(k<=number)
            {
                ZeroOnePack(k*weight,k*value);
                number = number-k;
                k = 2*k;//这里采用二进制思想
            }
            ZeroOnePack(number*weight,number*value);
        }
    }
}
												
											Java实现 蓝桥杯 算法提高 小X的购物计划的更多相关文章
- Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)
		
试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...
 - Java实现 蓝桥杯 算法提高 天天向上(DP)
		
试题 算法提高 天天向上 问题描述 A同学的学习成绩十分不稳定,于是老师对他说:"只要你连续4天成绩有进步,那我就奖励给你一朵小红花."可是这对于A同学太困难了.于是,老师对他放宽 ...
 - Java实现 蓝桥杯 算法提高 欧拉函数(数学)
		
试题 算法提高 欧拉函数 问题描述 老师出了一道难题,小酱不会做,请你编个程序帮帮他,奖金一瓶酱油: 从1-n中有多少个数与n互质? |||||╭══╮ ┌═════┐ ╭╯让路║═║酱油专用车║ ╰ ...
 - Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
		
试题 算法提高 转圈游戏 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在 ...
 - Java实现 蓝桥杯 算法提高 矩阵乘法(暴力)
		
试题 算法提高 矩阵乘法 问题描述 小明最近刚刚学习了矩阵乘法,但是他计算的速度太慢,于是他希望你能帮他写一个矩阵乘法的运算器. 输入格式 输入的第一行包含三个正整数N,M,K,表示一个NM的矩阵乘以 ...
 - Java实现 蓝桥杯 算法提高 矩阵相乘
		
算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也 ...
 - Java实现 蓝桥杯 算法提高 拿糖果
		
算法提高 拿糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因 ...
 - Java实现 蓝桥杯 算法提高 快乐司机
		
算法提高 快乐司机 时间限制:1.0s 内存限制:256.0MB 问题描述 "嘟嘟嘟嘟嘟嘟 喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙" 这是儿歌"快乐的 ...
 - Java实现 蓝桥杯 算法提高 秘密行动
		
试题 算法提高 秘密行动 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面.这座大厦有一个神奇的特点,每层的高度都不一样, ...
 
随机推荐
- Scala 中 Any 类源码
			
package scalaabstract class Any { def equals(that: Any): Boolean //值比较 def hashCode(): Int //hash值 d ...
 - 整理了最全的Python3数据类型转换方法,可以收藏当手册用
			
本文基于python3.8版本,总结了各种数据类型直接的转换规则和方法.算是比较全了,可以收藏当手册来查. 概述 数据类型转换,指的是通过某种方法,将一个数据由原来的类型转换为另外一个类型.比如,我们 ...
 - java ->多线程_线程同步、死锁、等待唤醒机制
			
线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ...
 - 非系统盘根目录出现msdia80.dll文件,能否删除?
			
出现此问题的原因:计算机上安装了 Microsoft Visual C++ 2005 可再发行组件时,Msdia80.dll文件被错误安装在其他驱动器的根文件夹中. 它的正确路径应该是"C: ...
 - nginx default server
			
配合server_name _ 可以匹配所有的域名,在设置default server 可以轻松屏蔽一些非域名访问的请求. 配置如下 server { listen 80 default_server ...
 - zabbix email报警
			
把email 报警整了一遍 . 1 ,先把mail 系统整好. 我用的是sendmail yum install -y sendmail sendmail-cf vim /etc/mail/local ...
 - [Unity3D]编辑器扩展之数组或List显示
			
效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...
 - RN中的常用组件-----图片
			
1.RN中的常用组件-----图片 本地图片: <Image source={require('../src/assets/x.jpg')}/> 本地图片可以无需指定尺寸(因为导入/打包 ...
 - 12.1面向对象编程的介绍(oop):封装,继承,多态,访问私有属性
			
#封装:内部对数据封装.作用:1.保护数据,防止被随意修改:2.使外部的程序不需要关注内部的构造:只需要提供接口给外部进行访问即可.#继承:一个类就相当于一个模板.通过父类,子类的方式实现不同角色的共 ...
 - NetAnalyzer笔记 之 十二  NetAnalyzer 6.0 的使用方法 -- 1.初识NetAnalyzer
			
上次写NetAnalyzer使用方法是2016年的时候了,在后来NetAnalyzer经过了巨大的版本更变,但是因为个人原因,一直未对使用方法进行更新,现在NetAnalyzer最新的6.0已经发布了 ...