如何让var函数值变为负数

Hello, I am Pandy.

坚持输出优质博客,翻译高质量文章

如果你有任何问题的话,欢迎来公众号『Yopth』联系我

文章很多,我做了一个网站用于索引:『 https://yopth.github.io/ 』,觉得不错的话也可以到GitHub给个star

假设我们有一个变量--z-margin-left需要把它变为负数,直接加符号操作符-var(-z-margin-left)不会得到结果,我们需要考虑用calc函数:

以谷歌浏览器为例,我们来去修改它的LOGO:

image.png

方法一:使用减法

我们定义一个变量,并且使用减法:

    --z-margin-left: 800px;
    margin-left: calc(0px - var(--z-margin-left));

效果如下:

image.png

方法二:使用乘法

乘法我们可以考虑让变量乘以-1

    --z-margin-left: 800px;
    margin-left: calc(-1 * var(--z-margin-left));

同样可以达到我们想要的效果

image.png

我是 Pandy,一个喜欢英语的程序猿 👨‍💻

关注公众号 Yopth,回复「加群」,加入「英文技术翻译互助群」,我们加入一起充电英语 🔌

%% 原料数据初始化 lengths = [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, ... 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, ... 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, ... 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, ... 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, ... 23, 23.5, 24, 24.5, 25, 25.5]; stocks = [43, 59, 39, 41, 27, 28, 34, 21, ... 24, 24, 20, 25, 21, 23, 21, 18, ... 31, 23, 22, 59, 18, 25, 35, 29, ... 30, 42, 28, 42, 45, 49, 50, 64, ... 52, 63, 49, 35, 27, 16, 12, 2, ... 0, 6, 0, 0, 0, 1]; % 原料分组索引 spec1_direct = 1:8; % 规格1直接使用 (3-6.5m) spec2_direct = 9:22; % 规格2直接使用 (7-13.5m) spec3_direct = 23:46; % 规格3直接使用 (14m+) % 可降级原料索引 downgrade1_idx = []; % 可降级至规格1的原料 (6.5 < len <= 8.5) downgrade2_idx = []; % 可降级至规格2的原料 (13.5 < len <= 22.5) for j = spec2_direct if lengths(j) > 6.5 && lengths(j) <= 8.5 downgrade1_idx = [downgrade1_idx, j]; end end for j = spec3_direct if lengths(j) > 13.5 && lengths(j) <= 22.5 downgrade2_idx = [downgrade2_idx, j]; end end %% 估算最大捆数 total_stocks = sum(stocks); n_max = min([floor(total_stocks/4), ... % 规格3最小根数 floor(total_stocks/7), ... % 规格2最小根数 floor(total_stocks/19)]); % 规格1最小根数 fprintf(&#39;最大潜在捆数估算: %d\n&#39;, n_max); %% 建立模型基础结构 n = n_max; % 最大潜在捆数 num_vars = 3*n + 46*n + length(downgrade1_idx)*n + length(downgrade2_idx)*n; % 变量索引映射 x_start = 1; % X_ik (3n个变量) c_start = 3*n + 1; % C_ij (46n个变量) d1_start = c_start + 46*n;% D_ij^{(1)} d2_start = d1_start + length(downgrade1_idx)*n; % D_ij^{(2)} %% 第一阶段:最大化总捆数 fprintf(&#39;\n=== 第一阶段:最大化总捆数 ===\n&#39;); % 目标函数:最大化总捆数 f = zeros(num_vars, 1); f(x_start:x_start+3*n-1) = 1; % 所有X_ik系数为1 % 约束计数器 constr_count = 0; % 约束1:每个捆选择恰好一种规格 (n个等式约束) A1 = zeros(n, num_vars); for i = 1:n idx = x_start + 3*(i-1); A1(i, idx:idx+2) = 1; end b1 = ones(n, 1); constr_count = constr_count + n; % 约束2:规格1长度约束 (2n个不等式) A2 = zeros(2*n, num_vars); b2 = zeros(2*n, 1); for i = 1:n % 下界约束: 88.5*X_i1 <= sum idx = x_start + 3*(i-1); A2(2*i-1, idx) = -88.5; % -88.5*X_i1 % 上界约束: sum <= 89.5*X_i1 A2(2*i, idx) = 89.5; % 89.5*X_i1 % 原料求和项 for j = spec1_direct var_idx = c_start + 46*(i-1) + j - 1; A2(2*i-1, var_idx) = lengths(j); % 正系数 A2(2*i, var_idx) = -lengths(j); % 负系数 end for j = downgrade1_idx d_idx = find(downgrade1_idx == j); var_idx = d1_start + length(downgrade1_idx)*(i-1) + d_idx - 1; A2(2*i-1, var_idx) = lengths(j); % 正系数 A2(2*i, var_idx) = -lengths(j); % 负系数 end end b2(1:2:end) = 0; % 下界约束 <= 0 b2(2:2:end) = 0; % 上界约束 <= 0 constr_count = constr_count + 2*n; % 约束3:规格2长度约束 (2n个不等式) A3 = zeros(2*n, num_vars); b3 = zeros(2*n, 1); for i = 1:n idx = x_start + 3*(i-1) + 1; % X_i2 A3(2*i-1, idx) = -88.5; % -88.5*X_i2 A3(2*i, idx) = 89.5; % 89.5*X_i2 for j = spec2_direct var_idx = c_start + 46*(i-1) + j - 1; A3(2*i-1, var_idx) = lengths(j); A3(2*i, var_idx) = -lengths(j); end for j = downgrade2_idx d_idx = find(downgrade2_idx == j); var_idx = d2_start + length(downgrade2_idx)*(i-1) + d_idx - 1; A3(2*i-1, var_idx) = lengths(j); A3(2*i, var_idx) = -lengths(j); end end b3(1:2:end) = 0; b3(2:2:end) = 0; constr_count = constr_count + 2*n; % 约束4:规格3长度约束 (2n个不等式) A4 = zeros(2*n, num_vars); b4 = zeros(2*n, 1); for i = 1:n idx = x_start + 3*(i-1) + 2; % X_i3 A4(2*i-1, idx) = -88.5; % -88.5*X_i3 A4(2*i, idx) = 89.5; % 89.5*X_i3 for j = spec3_direct var_idx = c_start + 46*(i-1) + j - 1; A4(2*i-1, var_idx) = lengths(j); A4(2*i, var_idx) = -lengths(j); end end b4(1:2:end) = 0; b4(2:2:end) = 0; constr_count = constr_count + 2*n; % 约束5:库存限制 (46个不等式) A5 = zeros(46, num_vars); b5 = stocks&#39;; for j = 1:46 for i = 1:n % C_ij var_idx = c_start + 46*(i-1) + j - 1; A5(j, var_idx) = 1; % D_ij^{(1)} if ismember(j, downgrade1_idx) d_idx = find(downgrade1_idx == j); var_idx = d1_start + length(downgrade1_idx)*(i-1) + d_idx - 1; A5(j, var_idx) = 1; end % D_ij^{(2)} if ismember(j, downgrade2_idx) d_idx = find(downgrade2_idx == j); var_idx = d2_start + length(downgrade2_idx)*(i-1) + d_idx - 1; A5(j, var_idx) = 1; end end end constr_count = constr_count + 46; % 合并所有约束 A = [A1; A2; A3; A4; A5]; b = [b1; b2; b3; b4; b5]; % 变量边界 lb = zeros(num_vars, 1); ub = Inf(num_vars, 1); % X_ik为0-1变量 ub(x_start:x_start+3*n-1) = 1; % 整数约束:所有变量为整数 intcon = 1:num_vars; % 求解第一阶段 options = optimoptions(&#39;intlinprog&#39;, &#39;Display&#39;, &#39;iter&#39;, &#39;MaxTime&#39;, 600); [x1, fval1, exitflag1] = intlinprog(-f, intcon, A, b, [], [], lb, ub, options); if exitflag1 <= 0 error(&#39;第一阶段求解失败&#39;); end total_bundles = round(fval1); fprintf(&#39;第一阶段结果:最大总捆数 = %d\n&#39;, total_bundles); %% 第二阶段:最大化第3类捆数 fprintf(&#39;\n=== 第二阶段:最大化第3类捆数 ===\n&#39;); % 添加约束:总捆数等于第一阶段结果 A_eq1 = zeros(1, num_vars); A_eq1(x_start:x_start+3*n-1) = 1; b_eq1 = total_bundles; % 目标函数:最大化第3类捆数 f2 = zeros(num_vars, 1); for i = 1:n idx = x_start + 3*(i-1) + 2; % X_i3 f2(idx) = 1; end % 求解第二阶段 [x2, fval2, exitflag2] = intlinprog(-f2, intcon, A, b, A_eq1, b_eq1, lb, ub, options); if exitflag2 <= 0 error(&#39;第二阶段求解失败&#39;); end spec3_bundles = round(-fval2); fprintf(&#39;第二阶段结果:第3类捆数 = %d\n&#39;, spec3_bundles); %% 第三阶段:最大化第2类捆数 fprintf(&#39;\n=== 第三阶段:最大化第2类捆数 ===\n&#39;); % 添加约束:第3类捆数等于第二阶段结果 A_eq2 = zeros(1, num_vars); for i = 1:n idx = x_start + 3*(i-1) + 2; % X_i3 A_eq2(idx) = 1; end b_eq2 = spec3_bundles; % 目标函数:最大化第2类捆数 f3 = zeros(num_vars, 1); for i = 1:n idx = x_start + 3*(i-1) + 1; % X_i2 f3(idx) = 1; end % 求解第三阶段 [x3, fval3, exitflag3] = intlinprog(-f3, intcon, A, b, [A_eq1; A_eq2], [b_eq1; b_eq2], lb, ub, options); if exitflag3 <= 0 error(&#39;第三阶段求解失败&#39;); end spec2_bundles = round(-fval3); spec1_bundles = total_bundles - spec3_bundles - spec2_bundles; %% 输出最终结果 fprintf(&#39;\n=== 最终优化结果 ===\n&#39;); fprintf(&#39;总捆数: %d\n&#39;, total_bundles); fprintf(&#39;规格1捆数: %d\n&#39;, spec1_bundles); fprintf(&#39;规格2捆数: %d\n&#39;, spec2_bundles); fprintf(&#39;规格3捆数: %d\n&#39;, spec3_bundles); % 计算原料使用率 used = zeros(46, 1); for j = 1:46 for i = 1:n % C_ij idx = c_start + 46*(i-1) + j - 1; used(j) = used(j) + x3(idx); % D_ij^{(1)} if ismember(j, downgrade1_idx) d_idx = find(downgrade1_idx == j); idx = d1_start + length(downgrade1_idx)*(i-1) + d_idx - 1; used(j) = used(j) + x3(idx); end % D_ij^{(2)} if ismember(j, downgrade2_idx) d_idx = find(downgrade2_idx == j); idx = d2_start + length(downgrade2_idx)*(i-1) + d_idx - 1; used(j) = used(j) + x3(idx); end end end utilization = used ./ stocks&#39;; fprintf(&#39;\n原料使用情况:\n&#39;); disp(table((1:46)&#39;, lengths&#39;, stocks&#39;, used, utilization, ... &#39;VariableNames&#39;, {&#39;原料ID&#39;, &#39;长度&#39;, &#39;库存&#39;, &#39;使用量&#39;, &#39;使用率&#39;})); 第一阶段:最大化总捆数 === LP: Optimal objective value is 0.000000. 找到最优解。 Intlinprog 在根节点处停止,因为 目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 0。intcon 变量是 容差范围内的整数,options.IntegerTolerance = 1e-05。 第一阶段结果:最大总捆数 = 0 === 第二阶段:最大化第3类捆数 === LP: Optimal objective value is 0.000000. 找到最优解。 Intlinprog 在根节点处停止,因为 目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 0。intcon 变量是 容差范围内的整数,options.IntegerTolerance = 1e-05。 第二阶段结果:第3类捆数 = 0 === 第三阶段:最大化第2类捆数 === LP: Optimal objective value is 0.000000. 找到最优解。 Intlinprog 在根节点处停止,因为 目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 0。intcon 变量是 容差范围内的整数,options.IntegerTolerance = 1e-05。 === 最终优化结果 === 总捆数: 0 规格1捆数: 0 规格2捆数: 0 规格3捆数: 0 为什么都是0?
最新发布
07-19
“import numpy as np import pickle import time import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from pymoo.core.problem import ElementwiseProblem from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.core.callback import Callback from pymoo.optimize import minimize from pymoo.indicators.hv import Hypervolume from pymoo.core.population import Population from pymoo.core.variable import Real, Integer from pymoo.core.mixed import MixedVariableMating, MixedVariableSampling, MixedVariableDuplicateElimination from pymoo.operators.mutation.pm import PolynomialMutation from pymoo.operators.crossover.sbx import SBX class OptimProblem(ElementwiseProblem): def __init__(self): # 定义变量边界(48个变量,移除了x44/x47/x49) self.vars = { "x01": Real(bounds=(1538, 1870)), # S101-M "x02": Real(bounds=(20148, 24544)), # S104-M "x03": Real(bounds=(1827.5, 2179.5)), # S108-M "x04": Real(bounds=(7863.51, 9538.54)), # S112-M "x05": Real(bounds=(299.604, 364.467)), # S201-M "x06": Real(bounds=(84837.5, 103471)), # S313-M "x07": Real(bounds=(13.0821, 15.9591)), # S313-T "x08": Real(bounds=(426.6, 521.4)), # S313-P "x09": Real(bounds=(18857.3, 22984.1)), # H101-M "x10": Real(bounds=(288.71, 350.558)), # H101-COT "x11": Real(bounds=(18040.6, 21986.5)), # H102-M "x12": Real(bounds=(540.196, 659.749)), # H102-COT "x13": Real(bounds=(10632, 12973)), # H201-M "x14": Real(bounds=(288.167, 351.655)), # H201-HOT "x15": Real(bounds=(14517.8, 17590.1)), # H301-M "x16": Real(bounds=(58.271, 70.9577)), # H301-HOT "x17": Real(bounds=(72029.7, 87790.8)), # H302-M "x18": Real(bounds=(57.225, 69.1627)), # H302-COT "x19": Real(bounds=(6685.61, 8148.55)), # H303-M "x20": Real(bounds=(-9.29859, -7.62888)), # H303-HOT "x21": Real(bounds=(900.657, 1098.62)), # RE101-C "x22": Real(bounds=(9.02238, 10.8986)), # RE101-H "x23": Real(bounds=(1.35287, 1.64148)), # RE101-D "x24": Real(bounds=(910.653, 1101.31)), # RE102-C "x25": Real(bounds=(7.2783, 8.7985)), # RE102-H "x26": Real(bounds=(0.722521, 0.876798)), # RE102-D "x27": Real(bounds=(1351.32, 1647.75)), # RE103-C "x28": Real(bounds=(7.22507, 8.77916)), # RE103-H "x29": Real(bounds=(1.38167, 1.61998)), # RE103-D "x30": Real(bounds=(1.80656, 2.19881)), # RE201-P "x31": Real(bounds=(6.31061, 7.6632)), # RE201-L "x32": Real(bounds=(0.453803, 0.549121)), # RE201-D "x33": Real(bounds=(1.80579, 2.19799)), # F201-P "x34": Real(bounds=(135.366, 164.98)), # F201-T "x35": Real(bounds=(1.75542, 2.14253)), # AB301-P1 "x36": Integer(bounds=(11, 14)), # AB301-N "x37": Real(bounds=(0.0930186, 0.113473)), # R301-P1 "x38": Real(bounds=(1.81906, 2.21977)), # R301-R "x39": Real(bounds=(5889250, 6683890)), # R301-QN "x40": Real(bounds=(0.757167, 0.923944)), # R302-P1 "x41": Real(bounds=(-71041.4, -58147.9)), # R302-Q1 "x42": Integer(bounds=(7, 8)), # R301-N "x43": Real(bounds=(0.108235, 0.130973)), # V301-P # "x44": Integer(bounds=(8, 9)), # R301-FEEDS "x45": Integer(bounds=(7, 8)), # R302-N "x46": Real(bounds=(0.772167, 0.941046)), # V302-P # "x47": Integer(bounds=(8, 9)), # R302-FEEDS "x48": Real(bounds=(1.78042, 2.17364)), # V303-P # "x49": Integer(bounds=(12, 15)), # AB301-FEEDS "x50": Real(bounds=(58, 71)), # F301-T "x51": Real(bounds=(1.98292, 2.37614)), # F301-P } # 预加载模型(避免重复磁盘I/O) self.models = { &#39;TAC&#39;: pickle.load(open("TAC.dat", "rb")), &#39;CO2R&#39;: pickle.load(open("CO2R.dat", "rb")), &#39;HD&#39;: pickle.load(open("HD.dat", "rb")), &#39;C1C2R&#39;: pickle.load(open("C1C2R.dat", "rb")), &#39;RE101Y&#39;: pickle.load(open("RE101Y.dat", "rb")), &#39;RE102Y&#39;: pickle.load(open("RE102Y.dat", "rb")), &#39;RE103Y&#39;: pickle.load(open("RE103Y.dat", "rb")), &#39;RE201Y&#39;: pickle.load(open("RE201Y.dat", "rb")) } super().__init__(vars=self.vars, n_obj=3, n_constr=5) # 修正约束数量 def _evaluate(self, x, out, *args, **kwargs): # 1. 构建完整51维输入向量 input_vector = self._construct_input_vector(x) # 2. 预测目标值 TAC, HD, C1C2R = self._predict_objectives(input_vector) # 3. 预测约束值 CO2R, RE101Y, RE102Y, RE103Y, RE201Y = self._predict_constraints(input_vector) # 4. 设置目标函数 out["F"] = np.array([ TAC, # 最小化TAC(原值) # -CO2R, # 最小化负CO2纯度(相当于最大化CO2R) HD, # 最小化HD(原值) -C1C2R # 最小化负C1-C2回收(相当于最大化C1C2R) ]) # 5. 设置约束条件(g <= 0) tolerance = 1e-6 # 约束容差 out["G"] = np.array([ 0.90 - CO2R + tolerance, # 允许轻微违反约束 0.90 - RE101Y + tolerance, 0.90 - RE102Y + tolerance, 0.90 - RE103Y + tolerance, 0.90 - RE201Y + tolerance ]) def _construct_input_vector(self, x): """构建51维输入向量,动态计算x44/x47/x49""" # 基础向量(按顺序提取48个变量) base = np.array([x[f"x{k:02}"] for k in range(1, 52) if f"x{k:02}" in self.vars]) # 插入计算得到的变量(基于优化规则) x44_val = x["x42"] + 1 # x44 = x42 + 1 R301-FEEDS x47_val = x["x45"] + 1 # x47 = x45 + 1 R302-FEEDS x49_val = x["x36"] + 1 # x49 = x36 + 1 AB301-FEEDS # 在指定位置插入计算值 return np.insert(base, [43, 46, 48], [x44_val, x47_val, x49_val]) def _predict_objectives(self, X): """预测三个目标值""" X = X.reshape(1, -1) return ( self.models[&#39;TAC&#39;].predict(X)[0], # self.models[&#39;CO2R&#39;].predict(X)[0], self.models[&#39;HD&#39;].predict(X)[0], self.models[&#39;C1C2R&#39;].predict(X)[0] ) def _predict_constraints(self, X): """预测五个约束值""" X = X.reshape(1, -1) return ( self.models[&#39;CO2R&#39;].predict(X)[0], self.models[&#39;RE101Y&#39;].predict(X)[0], self.models[&#39;RE102Y&#39;].predict(X)[0], self.models[&#39;RE103Y&#39;].predict(X)[0], self.models[&#39;RE201Y&#39;].predict(X)[0] ) # 优化配置 def setup_algorithm(pop_size=200): return NSGA2( pop_size=pop_size, sampling=MixedVariableSampling(), crossover=SBX(prob=0.85, eta=20),# 降低交叉概率,增加分布指数 mutation=PolynomialMutation(prob=0.7, eta=30),# 调整变异概率 mating=MixedVariableMating(eliminate_duplicates=MixedVariableDuplicateElimination()), eliminate_duplicates=MixedVariableDuplicateElimination() ) # 运行优化 if __name__ == "__main__": start_time = time.time() problem = OptimProblem() algorithm = setup_algorithm() res = minimize(problem, algorithm, (&#39;n_gen&#39;, 100), seed=42, save_history=True, verbose=True) # 提取最优结果 opt_X = np.array([[sol.X[k] for k in problem.vars] for sol in res.opt]) opt_F = res.F # 保存结果 np.savetxt("optimal_variables.csv", opt_X, delimiter=",", header=",".join(problem.vars.keys()), comments=&#39;&#39;) np.savetxt("optimal_objectives.csv", opt_F, delimiter=",", header="-TAC,-HD,C1C2R", comments=&#39;&#39;) # 可视化三个目标对 fig, ax = plt.subplots(1, 1, figsize=(8, 6)) scatter = ax.scatter(opt_F[:, 0], opt_F[:, 2], c=-opt_F[:, 1], cmap="viridis") ax.set_title("TAC vs HD (color=C1C2R)") ax.set_xlabel("TAC") ax.set_ylabel("HD") plt.colorbar(scatter, ax=ax) plt.tight_layout() plt.savefig("pareto_front_3metrics.png", dpi=900) plt.show() fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection=&#39;3d&#39;) ax.scatter(opt_F[:, 0], -opt_F[:, 1], opt_F[:, 2], c=&#39;teal&#39;, s=40) ax.set_xlabel(&#39;TAC&#39;) ax.set_ylabel(&#39;C1C2R&#39;) ax.set_zlabel(&#39;HD&#39;) ax.set_title(&#39;3D Pareto Front: TAC vs CO2R vs HD&#39;) plt.tight_layout() plt.savefig("pareto_3d_TAC_C1C2R_HD.png", dpi=900) plt.show() # 生成所有二维目标对图像 plt.figure(figsize=(6,5)) plt.scatter(opt_F[:, 0], -opt_F[:, 1], c=&#39;darkblue&#39;) plt.xlabel("TAC") plt.ylabel("C1C2R") plt.title("TAC vs C1C2R") plt.tight_layout() plt.savefig("pareto_TAC_vs_C1C2R.png", dpi=900) plt.show() plt.figure(figsize=(6,5)) plt.scatter(opt_F[:, 0], opt_F[:, 2], c=&#39;darkred&#39;) plt.xlabel("TAC") plt.ylabel("HD") plt.title("TAC vs HD") plt.tight_layout() plt.savefig("pareto_TAC_vs_HD.png", dpi=900) plt.show() plt.figure(figsize=(6,5)) plt.scatter(-opt_F[:, 1], opt_F[:, 2], c=&#39;darkgreen&#39;) plt.xlabel("C1C2R") plt.ylabel("HD") plt.title("C1C2R vs HD") plt.tight_layout() plt.savefig("pareto_C1C2R_vs_HD.png", dpi=900) plt.show() # 自动选最优解:距离理想点最近 # 仅从 C1C2R ≥ 0.80 的解中推荐最优解 valid_idx = np.where(-opt_F[:, 1] >= 0.80)[0] if len(valid_idx) > 0: subset = opt_F[valid_idx] ideal_point = np.array([min(subset[:, 0]), max(subset[:, 1]), min(subset[:, 2])]) normalized = np.column_stack([subset[:, 0], -subset[:, 1], subset[:, 2]]) distances = np.linalg.norm(normalized - ideal_point, axis=1) best_idx_in_subset = valid_idx[np.argmin(distances)] print("\n==== 推荐解====") print("索引:", best_idx_in_subset) print("变量配置:") for name, val in zip(problem.vars.keys(), opt_X[best_idx_in_subset]): print(f" {name}: {val:.4f}") print("对应目标函数值:") print(f" TAC: {opt_F[best_idx_in_subset, 0]:.4f}") print(f" C1C2R: {-opt_F[best_idx_in_subset, 1]:.4f}") print(f" HD: {opt_F[best_idx_in_subset, 2]:.4f}")”这是我的代码,但是我不想规定C1C2R一定要大于多少了,请为我修改嗲吗
07-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值