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. 修改/编辑jar包

    替换或者导入jar包时,jar包被自动压缩,springboot规定嵌套的jar包不能在被压缩的情况下存储. 解决(本文以升级ojdbc包为例): 使用jar命令解压jar包,在压缩包外重新替换jar ...

  2. 线程Thread小记

    1 public class ConcurentDemo extends Thread { 2 @Override 3 public void run() { 4 super.run(); 5 Sys ...

  3. C#比较类/接口、Dictionary 排序

    作者:l625208058 链接:https://www.jianshu.com/p/cd1be6652570 先 F12 看下 List.Sort() 方法 public void Sort(int ...

  4. Github学生认证具体步骤

    具体步骤展示 一.进入相关的申请地址 地址在此:https://education.github.com/pack/ 二.选中右上方的Student,然后选择第二个选项 在我们已经注册号Github账 ...

  5. 基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)

    本文介绍如何通过 Agora SDK 在 Windows 平台快速实现互动直播.互动直播和实时通话的区别就在于,直播频道的用户有角色之分.你可以将角色设置为主播或者观众,其中主播可以收.发流,观众只能 ...

  6. HDFS 组织架构

    一.HDFS 概述 HDFS 产生背景:随着数据量越来越多,一个系统存储不下所有的数据,那么就需要分配到多个操作系统的磁盘中进行存储,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就 ...

  7. 关于Docker compose值IP与域名的映射 之 extra_host

    公司的所有项目都是采用Docker容器化部署,最近有一个项目需要使用定时任务调用第三方Api,正式web环境服务器的网络与第三方网络是通畅的,但是当将代码发布到正式环境,调用接口却显示 System. ...

  8. webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题

    webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 目录 webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 记录个iusse. 插入音频数据后,GetAu ...

  9. 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更新 ...

  10. 迁移学习(SPI)《Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection》

    论文信息 论文标题:Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection论文作者:Abhay Raw ...