2022-08-12:方案1 : {7, 10};
xxxx : {a , b};
1 2 3 4;
FunnyGoal = 100;
OffenseGoal = 130。
找到一个最少方案数,让FunnyGoal、OffenseGoal,都大于等于。
定义如下尝试过程:
贴纸数组stickers,
stickers[i][0] : i号贴纸的Funny值,
stickers[i][1] : i号贴纸的Offense值。
index…所有的贴纸,随便选择。index之前的贴纸不能选择,
在让restFunny和restOffense都小于等于0的要求下,返回最少的贴纸数量。
来自弗吉尼亚理工大学(VT),算法考试卷。

答案2022-08-12:

递归,从左往右,要i还是不要i。
动态规划。

代码用rust编写。代码如下:

fn main() {
let mut stickers: Vec<Vec<i32>> =
vec![vec![1, 5], vec![2, 4], vec![3, 3], vec![4, 2], vec![5, 1]];
let ans1 = min_stickers1(&mut stickers, 3, 5);
let ans2 = min_stickers2(&mut stickers, 3, 5);
let ans3 = min_stickers3(&mut stickers, 3, 5);
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
println!("ans3 = {}", ans3);
} fn min_stickers1(stickers: &mut Vec<Vec<i32>>, funny_goal: i32, offense_goal: i32) -> i32 {
return process1(stickers, 0, funny_goal, offense_goal);
} const MAX_VALUE: i32 = 1 << 31 - 1; fn process1(stickers: &mut Vec<Vec<i32>>, index: i32, rest_funny: i32, rest_offense: i32) -> i32 {
if rest_funny <= 0 && rest_offense <= 0 {
return 0;
}
if index == stickers.len() as i32 {
return MAX_VALUE;
}
// 不选当前的贴纸
let p1 = process1(stickers, index + 1, rest_funny, rest_offense);
// 选当前贴纸
let mut p2 = MAX_VALUE;
let next2 = process1(
stickers,
index + 1,
get_max(0, rest_funny - stickers[index as usize][0]),
get_max(0, rest_offense - stickers[index as usize][1]),
);
if next2 != MAX_VALUE {
p2 = next2 + 1;
}
return get_min(p1, p2);
} fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
} fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
} // 改动态规划
fn min_stickers2(stickers: &mut Vec<Vec<i32>>, funny_goal: i32, offense_goal: i32) -> i32 {
let mut dp: Vec<Vec<Vec<i32>>> = vec![];
for i in 0..stickers.len() as i32 {
dp.push(vec![]);
for j in 0..funny_goal + 1 {
dp[i as usize].push(vec![]);
for _ in 0..offense_goal + 1 {
dp[i as usize][j as usize].push(0);
}
}
}
for i in 0..stickers.len() as i32 {
for j in 0..=funny_goal {
for k in 0..=offense_goal {
dp[i as usize][j as usize][k as usize] = -1;
}
}
}
return process2(stickers, 0, funny_goal, offense_goal, &mut dp);
} fn process2(
stickers: &mut Vec<Vec<i32>>,
index: i32,
rest_funny: i32,
rest_offense: i32,
dp: &mut Vec<Vec<Vec<i32>>>,
) -> i32 {
if rest_funny <= 0 && rest_offense <= 0 {
return 0;
}
if index == stickers.len() as i32 {
return MAX_VALUE;
}
if dp[index as usize][rest_funny as usize][rest_offense as usize] != -1 {
return dp[index as usize][rest_funny as usize][rest_offense as usize];
}
// 不选当前的贴纸
let p1 = process2(stickers, index + 1, rest_funny, rest_offense, dp);
// 选当前贴纸
let mut p2 = MAX_VALUE;
let next2 = process2(
stickers,
index + 1,
get_max(0, rest_funny - stickers[index as usize][0]),
get_max(0, rest_offense - stickers[index as usize][1]),
dp,
);
if next2 != MAX_VALUE {
p2 = next2 + 1;
}
let ans = get_min(p1, p2);
dp[index as usize][rest_funny as usize][rest_offense as usize] = ans;
return ans;
} // 严格位置依赖的动态规划
fn min_stickers3(stickers: &mut Vec<Vec<i32>>, funny_goal: i32, offense_goal: i32) -> i32 {
let n = stickers.len() as i32;
let mut dp: Vec<Vec<Vec<i32>>> = vec![];
for i in 0..n + 1 {
dp.push(vec![]);
for j in 0..funny_goal + 1 {
dp[i as usize].push(vec![]);
for _ in 0..offense_goal + 1 {
dp[i as usize][j as usize].push(0);
}
}
}
for f in 0..=funny_goal {
for o in 0..=offense_goal {
if f != 0 || o != 0 {
dp[n as usize][f as usize][o as usize] = MAX_VALUE;
}
}
}
let mut i = n - 1;
while i >= 0 {
for f in 0..=funny_goal {
for o in 0..=offense_goal {
if f != 0 || o != 0 {
let p1 = dp[(i + 1) as usize][f as usize][o as usize];
let mut p2 = MAX_VALUE;
let next2 = dp[(i + 1) as usize]
[get_max(0, f - stickers[i as usize][0]) as usize]
[get_max(0, o - stickers[i as usize][1]) as usize];
if next2 != MAX_VALUE {
p2 = next2 + 1;
}
dp[i as usize][f as usize][o as usize] = get_min(p1, p2);
}
}
}
i -= 1;
}
return dp[0][funny_goal as usize][offense_goal as usize];
}

执行结果如下:


左神java代码

2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal = 130。 找到一个最少方案数,让Fu的更多相关文章

  1. Quartus ii 12.0 和ModelSim 10.1 SE安装及连接

    quartus ii 10.0后就没有自带的仿真软件,每次写完一个VerilogHDL都想简单仿真一下,结果发现没有了自带仿真软件.这时候就需要第三方仿真软件ModelSim 10.1 SE. Qua ...

  2. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  3. VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt

    VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...

  4. 08 安装虚拟机:Windows 10

    08 安装虚拟机:Windows 10 在安装虚拟机之前,总是要有安装来源媒体(例如:ISO映像之类),方可顺利进行.在Proxmox VE中有几种将ISO档置入Proxmox VE的方式,本节介绍其 ...

  5. error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法

    1 问题还原 这里我有三个源文件:Base.hpp, Base.cpp 和 main.cpp 在Base.hpp里面定义一个基类,注意,基类只包含构造函数和析构函数的声明,函数在Base.cpp里实现 ...

  6. NFL原则告诉我们做决策的时候,试图找到一个能解决所有问题,“大而全”的方案是不存在的。我们应当找到最关心的问题,因地制宜做出选择。——聚焦目标,取舍有道!

    资源匮乏原则:有限的资源无法满足无穷的需要及欲望:因此想要多一点的某件东西,意味着必须放弃一些其他的东西:因为资源匮乏,所以我们必须做出选择. NFL原则:没有免费午餐定理(No Free Lunch ...

  7. 第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案

    第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案 在公钥密码学中,如果Alice想要给Bob发送一条消息,她需要Bob的公钥,一般来说公钥都很长,就像一个随机的字符串. 假设A ...

  8. vmware 12 安装 mac os 10.12正式版

    1.首先下载安装vmware 12 pro ,将VT打开(虚拟功能,以前安装过虚拟机点的同学可忽略). 2.下载mac ox 10.12正式版镜像文件(cdr后缀). 3.下载Unlocker208( ...

  9. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  10. 免费获得NOD32 半年、1年 激活码-14.08.12到期

    地址: http://nod32.ruanmei.com/ 活动时间: 2014年8月6日 - 8月12日(全部送完将提前终止). 活动规则: 1.每台电脑限领1枚NOD32激活码: 2.领到的NOD ...

随机推荐

  1. scrcpy投屏软件

    Android很好用得scrcpy 投屏软件: 下载传送门:https://github.com/Genymobile/scrcpy/releases 1.下载解压包后,解压至自己得电脑目录,并复制目 ...

  2. Windows下安装mysql的操作步骤

    免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web 应 ...

  3. 虚拟环境 venv的使用--(venv 一)

    一.引言最近在学习<Flask Web Development 2nd Edition>的时候,作者开篇就介绍如何使用 venv 来管理 Python 环境 .自我觉得作者讲的非常好,想要 ...

  4. ICSFUZZ:操纵I/O、二进制代码重用以及插桩,来Fuzzing工业控制应用程序

    ​ 本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 源码:GitHub - momalab/ICSFu ...

  5. Javaweb学习笔记第九弹

    MyBatis案例--环境准备 1.依据之前在Navicat建立数据表的方法,新建立一个数据表 2.将数据表的相关内容表现在Java文件的实例上:即成员变量和set.get成员方法 3.new一个测试 ...

  6. 14.AQS的前世,从1990年的论文说起

    大家好,我是王有志.关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活. 鸽了这么久怪不好意思的,因此送一本<多处理器编程的艺术>,快点击此处参加吧.另外欢迎大家加入"共同富裕的J ...

  7. Logoist - 适用于设计师以及初次使用者的快速制作精美 logo 工具

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/24c0f566dcf14be2aa72afaa78c87c40.png)>从简单的标识到设计开发.它只需要一点 ...

  8. 记某gov门户网站渗透测试(已修复)

    前言: 免责声明:涉及到的所有技术仅用来学习交流,严禁用于非法用途,未经授权请勿非法渗透.否则产生的一切后果自行承担! 该渗透测试项目为已授权项目,本文已对敏感部分做了相关处理. 正文: SQL注入( ...

  9. 1688关键字搜索新品数据API接口(item_search_new-按关键字搜索新品数据)

    1688关键字搜索新品数据API接口(item_search_new-按关键字搜索新品数据)代码接口教程如下: 公共参数 名称 类型 必须 描述key String 是 调用key(必须以GET方式拼 ...

  10. YUM下载全量依赖

    在离线的内网环境下进行安装一些软件的时候会出现依赖不完整的情况,一般情况下会使用如下方式进行下载依赖包 查看依赖包可以使用 yum deplist 进行查找 [root@localhost ~]# y ...