2023-08-12:用go语言写算法。实验室需要配制一种溶液,现在研究员面前有n种该物质的溶液,

每一种有无限多瓶,第i种的溶液体积为v[i],里面含有w[i]单位的该物质,

研究员每次可以选择一瓶溶液,

将其倒入另外一瓶(假设瓶子的容量无限),即可以看作将两个瓶子内的溶液合并,

此时合并的溶液体积和物质含量都等于之前两个瓶子内的之和。

特别地,如果瓶子A与B的溶液体积相同,那么A与B合并之后,

该物质的含量会产生化学反应,使得该物质含量增加x单位,

研究员的任务是配制溶液体积恰好等于c的,且尽量浓的溶液(即物质含量尽量多)。

研究员想要知道物质含量最多是多少?

对于所有数据,1 <= n, v[i], w[i], x, c <= 1000。

来自某红书。

来自左程云

答案2023-08-12:

大体步骤如下:

1.定义一个dp数组,长度为c+1,用来存储每个体积对应的最大物质含量。

2.初始化dp数组,将所有元素初始化为-1,表示尚未计算过。

3.对于每种溶液,如果其体积小于等于c,更新dp数组,将对应的物质含量设为其自身的物质含量。

4.开始从体积1到c的循环,对于每个体积i,在1到i/2的范围内循环,计算两个瓶子合并后的物质含量。

5.如果两个瓶子在dp数组中有对应的值,说明可以进行合并操作。

6.更新dp[i],将其设为之前两个瓶子内物质含量之和加上合并之后的额外物质增加量。

7.返回dp[c],即体积为c时的最大物质含量。

时间复杂度:代码中有两个嵌套循环,分别遍历n种溶液和体积范围,因此时间复杂度为O(n*c)。

空间复杂度:使用了一个长度为c+1的dp数组,因此空间复杂度为O(c+1),即O(c)。

go完整代码如下:

package main

import (
"fmt"
"math"
) func maxValue(v []int, w []int, x int, c int) int {
n := len(v)
dp := make([]int, c+1)
for i := range dp {
dp[i] = -1
}
for i := 0; i < n; i++ {
if v[i] <= c {
dp[v[i]] = int(math.Max(float64(dp[v[i]]), float64(w[i])))
}
}
for i := 1; i <= c; i++ {
for j := 1; j <= i/2; j++ {
if dp[j] != -1 && dp[i-j] != -1 {
dp[i] = int(math.Max(float64(dp[i]), float64(dp[j]+dp[i-j]+bonus(x, j, i-j))))
}
}
}
return dp[c]
} func bonus(x, j, k int) int {
if j == k {
return x
}
return 0
} func main() {
v := []int{5, 3, 4}
w := []int{2, 4, 1}
x := 4
c := 16
fmt.Println(maxValue(v, w, x, c))
}

rust完整代码如下:

fn max_value(v: &[i32], w: &[i32], x: i32, c: i32) -> i32 {
let n = v.len();
let mut dp = vec![-1; (c + 1) as usize]; for i in 0..n {
if v[i] <= c {
dp[v[i] as usize] = dp[v[i] as usize].max(w[i]);
}
} for i in 1..=c {
for j in 1..=(i / 2) {
if dp[j as usize] != -1 && dp[(i - j) as usize] != -1 {
let val = dp[j as usize] + dp[(i - j) as usize] + if j == (i - j) { x } else { 0 };
dp[i as usize] = dp[i as usize].max(val);
}
}
} dp[c as usize]
} fn main() {
let v = vec![5, 3, 4];
let w = vec![2, 4, 1];
let x = 4;
let c = 16; println!("{}", max_value(&v, &w, x, c));
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm> int maxValue(std::vector<int>& v, std::vector<int>& w, int x, int c) {
int n = v.size();
std::vector<int> dp(c + 1, -1); // dp[i] = -1, no solution to obtain volume i so far // Set values for naturally available volumes
for (int i = 0; i < n; i++) {
if (v[i] <= c) {
dp[v[i]] = std::max(dp[v[i]], w[i]);
}
} for (int i = 1; i <= c; i++) {
for (int j = 1; j <= i / 2; j++) {
if (dp[j] != -1 && dp[i - j] != -1) {
int val = dp[j] + dp[i - j] + (j == i - j ? x : 0);
dp[i] = std::max(dp[i], val);
}
}
} return dp[c];
} int main() {
std::vector<int> v = { 5, 3, 4 };
std::vector<int> w = { 2, 4, 1 };
int x = 4;
int c = 16; std::cout << maxValue(v, w, x, c) << std::endl; return 0;
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> int maxValue(int* v, int* w, int x, int n, int c) {
int* dp = (int*)malloc((c + 1) * sizeof(int)); for (int i = 0; i <= c; i++) {
dp[i] = -1;
} for (int i = 0; i < n; i++) {
if (v[i] <= c) {
*(dp + v[i]) = (*(dp + v[i]) > w[i]) ? *(dp + v[i]) : w[i];
}
} for (int i = 1; i <= c; i++) {
for (int j = 1; j <= i / 2; j++) {
if (*(dp + j) != -1 && *(dp + i - j) != -1) {
*(dp + i) = (*(dp + i) > ((*(dp + j)) + (*(dp + i - j)) + (j == i - j ? x : 0)))
? *(dp + i) : ((*(dp + j)) + (*(dp + i - j)) + (j == i - j ? x : 0));
}
}
} int result = *(dp + c);
free(dp);
return result;
} int main() {
int v[] = { 5, 3, 4 };
int w[] = { 2, 4, 1 };
int x = 4;
int c = 16;
int n = sizeof(v) / sizeof(v[0]);
printf("%d\n", maxValue(v, w, x, n, c)); return 0;
}

2023-08-12:用go语言写算法。实验室需要配制一种溶液,现在研究员面前有n种该物质的溶液, 每一种有无限多瓶,第i种的溶液体积为v[i],里面含有w[i]单位的该物质, 研究员每次可以选择一瓶的更多相关文章

  1. 用C语言写个程序推算出是星期几?(用泰勒公式实现)

    在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...

  2. 用C语言写解释器(一)——我们的目标

    声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的 ...

  3. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  4. c/c++面试总结---c语言基础算法总结2

    c/c++面试总结---c语言基础算法总结2 算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之 ...

  5. m_Orchestrate learning system---二十一、怎样写算法比较轻松

    m_Orchestrate learning system---二十一.怎样写算法比较轻松 一.总结 一句话总结:(1.写出算法步骤,这样非常有利于理清思路,这样就非常简单了 2.把问题分细,小问题用 ...

  6. LaTeX 写算法伪码

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50054953 LaTeX写算法伪码,需 ...

  7. 尚学python课程---12、python语言介绍

    尚学python课程---12.python语言介绍 一.总结 一句话总结: 1.操作简单:简便计算:允许通过单个“import”语句后跟一个函数调用来完成复杂的计算.虽慢 2.库丰富:比如人工智能和 ...

  8. 自己用C语言写单片机PIC18 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  9. 自己用C语言写单片机PIC16 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...

  10. php调用一个c语言写的接口问题

    用php调用一个c语言写的soap接口时,遇到一个问题:不管提交的数据正确与否,都无法请求到接口 1.用php标准的soap接口去请求 2.拼接xml数据去请求 以上两种方式都不正确 解决办法:php ...

随机推荐

  1. 2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为 好子集 。 比方说,如果 nums =

    2022-10-23:给你一个整数数组 nums .如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为 好子集 . 比方说,如果 nums = ...

  2. 2020-09-29:介绍volatile功能。

    福哥答案2020-09-29:#福大大架构师每日一题# 功能如下:1.内存可见.2.禁止指令重排序. 实现如下:1.字节码层面 ACC_VOLATILE 2.JVM层面volatile内存区的读写 都 ...

  3. 2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

    2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte:B:[]byte{} []uint8:C:[]uint8{} []byte:D:[]uin8{} []uint8. ...

  4. java开发学习框架

    Java基础 1.1. Java简介与安装 1.2. Java基本语法 1.3. 数据类型与变量 1.4. 运算符与表达式 1.5. 流程控制(分支与循环) 1.6. 数组 面向对象编程 2.1. 类 ...

  5. windows10环境下安装RabbitMQ以及延时插件(图文)

    安装转载:https://www.cnblogs.com/saryli/p/9729591.html 插件转载:https://blog.csdn.net/nbdclw/article/details ...

  6. C++面试八股文:了解位运算吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面: 面试官:了解位运算吗? 二师兄:了解一些.(我很熟悉) 面试官:请列举以下有哪些位运算? 二师兄:按位与(&).按位或(|).按位 ...

  7. 【Rust-book】第五章 使用结构体来组织相关联的数据

    第五章 使用结构体来组织相关联的数据 结构,或者结构体,是一种自定义数据类型,它允许我们命名多个相关的值并将它们组成一个有机的结合体. 可以把结构体视作对象中的数据属性 1 对比元组和结构体之间的异同 ...

  8. 从隐私保护到AI隐私保护:隐私隐私保护的跨隐私保护治理框架实践案例

    目录 标题:<从隐私保护到AI隐私保护:跨隐私保护治理框架实践案例> 背景介绍 随着人工智能技术的广泛应用,隐私保护问题也日益突出.数据隐私泄露.算法歧视等问题引发了公众的担忧和不满.为了 ...

  9. redis集群报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

    之前在x86架构的服务器部署redis集群,未遇到题中问题:然而在ARM架构的服务器部署redis集群,第一次遇到如此问题.虽然问题已经解决,但不清楚问题的具体原因,在此做个记录. 性能测试过程中,通 ...

  10. pixel 3xl 编译安卓与内核并烧入全流程(含安卓源码部分编译)

    pixel 3xl 编译安卓与内核并烧入全流程(含安卓源码部分编译) 目录 pixel 3xl 编译安卓与内核并烧入全流程(含安卓源码部分编译) 环境搭建 安卓源码下载 一.准备下载环境 1.安装Py ...