2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal = 130。 找到一个最少方案数,让Fu
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];
}
执行结果如下:

2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal = 130。 找到一个最少方案数,让Fu的更多相关文章
- Quartus ii 12.0 和ModelSim 10.1 SE安装及连接
quartus ii 10.0后就没有自带的仿真软件,每次写完一个VerilogHDL都想简单仿真一下,结果发现没有了自带仿真软件.这时候就需要第三方仿真软件ModelSim 10.1 SE. Qua ...
- 新手C#SQLServer在程序里实现语句的学习2018.08.12
从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...
- VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt
VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...
- 08 安装虚拟机:Windows 10
08 安装虚拟机:Windows 10 在安装虚拟机之前,总是要有安装来源媒体(例如:ISO映像之类),方可顺利进行.在Proxmox VE中有几种将ISO档置入Proxmox VE的方式,本节介绍其 ...
- error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法
1 问题还原 这里我有三个源文件:Base.hpp, Base.cpp 和 main.cpp 在Base.hpp里面定义一个基类,注意,基类只包含构造函数和析构函数的声明,函数在Base.cpp里实现 ...
- NFL原则告诉我们做决策的时候,试图找到一个能解决所有问题,“大而全”的方案是不存在的。我们应当找到最关心的问题,因地制宜做出选择。——聚焦目标,取舍有道!
资源匮乏原则:有限的资源无法满足无穷的需要及欲望:因此想要多一点的某件东西,意味着必须放弃一些其他的东西:因为资源匮乏,所以我们必须做出选择. NFL原则:没有免费午餐定理(No Free Lunch ...
- 第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案
第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案 在公钥密码学中,如果Alice想要给Bob发送一条消息,她需要Bob的公钥,一般来说公钥都很长,就像一个随机的字符串. 假设A ...
- vmware 12 安装 mac os 10.12正式版
1.首先下载安装vmware 12 pro ,将VT打开(虚拟功能,以前安装过虚拟机点的同学可忽略). 2.下载mac ox 10.12正式版镜像文件(cdr后缀). 3.下载Unlocker208( ...
- 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 ...
- 免费获得NOD32 半年、1年 激活码-14.08.12到期
地址: http://nod32.ruanmei.com/ 活动时间: 2014年8月6日 - 8月12日(全部送完将提前终止). 活动规则: 1.每台电脑限领1枚NOD32激活码: 2.领到的NOD ...
随机推荐
- 修改/编辑jar包
替换或者导入jar包时,jar包被自动压缩,springboot规定嵌套的jar包不能在被压缩的情况下存储. 解决(本文以升级ojdbc包为例): 使用jar命令解压jar包,在压缩包外重新替换jar ...
- 线程Thread小记
1 public class ConcurentDemo extends Thread { 2 @Override 3 public void run() { 4 super.run(); 5 Sys ...
- C#比较类/接口、Dictionary 排序
作者:l625208058 链接:https://www.jianshu.com/p/cd1be6652570 先 F12 看下 List.Sort() 方法 public void Sort(int ...
- Github学生认证具体步骤
具体步骤展示 一.进入相关的申请地址 地址在此:https://education.github.com/pack/ 二.选中右上方的Student,然后选择第二个选项 在我们已经注册号Github账 ...
- 基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)
本文介绍如何通过 Agora SDK 在 Windows 平台快速实现互动直播.互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播或者观众,其中主播可以收.发流,观众只能 ...
- HDFS 组织架构
一.HDFS 概述 HDFS 产生背景:随着数据量越来越多,一个系统存储不下所有的数据,那么就需要分配到多个操作系统的磁盘中进行存储,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就 ...
- 关于Docker compose值IP与域名的映射 之 extra_host
公司的所有项目都是采用Docker容器化部署,最近有一个项目需要使用定时任务调用第三方Api,正式web环境服务器的网络与第三方网络是通畅的,但是当将代码发布到正式环境,调用接口却显示 System. ...
- webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题
webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 目录 webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 记录个iusse. 插入音频数据后,GetAu ...
- 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈
二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更新 ...
- 迁移学习(SPI)《Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection》
论文信息 论文标题:Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection论文作者:Abhay Raw ...