【深度學習的靈魂】圖片布局生成模型LayoutPrompt(1)

🌈?個人主頁:十二月的貓-CSDN博客
🔥?系列專欄:?🏀《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客

💪🏻?十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光

目錄

1. 前言

2. LayoutPrompt介紹

3. LayoutPrompt · 布局序列化模塊

3.1 固定化Prompt

3.2?父類序列化模塊

3.3?子類序列化模塊

4. 總結


1. 前言

? ? ? ? 貓貓不知道大家有沒有思考過圖片布局生成模型,這算是生成模型的一個非常小的子任務了。前面帶大家學習過生成模型,包括GAN、Diffusion等。這些都算是生成模型的研究子領域,利用這些子領域的知識,我們可以來研究具體的任務,例如生成圖片、按照語言提示生成圖片、按照布局提示生成圖片等。

????????同樣生成布局也是生成模型中的一個具體任務,其實思路也是非常簡單。生成圖片這個任務中更具體的任務是生成海報、生成照片、生成動漫圖片等。因為直接生成一個海報難度太大,我們就先去生成布局,然后在具體布局的約束下去具體生成完整圖片。可以簡單給大家看一下布局是什么:

? ? ? ? 貓貓研究這個呢,主要還是因為創新實訓和軟件創新大賽兩個需要。同時由于貓貓也研究過一點生成模型,因此這個學期就研究一下這個領域啦~~如果大家也對這個領域感興趣,可以關注我們團隊的專欄(布局生成模型是我們海報生成系統中的一個子模塊,希望更多貓友參與到我們的開發當中哦):大模型實戰訓練營_十二月的貓的博客-CSDN博客

2. LayoutPrompt介紹

總的來說,為了完成LayoutPrompt模型,我們需要完成的子模塊有:

  • 數據預處理模塊:該模塊主要就是利用基礎數據預處理方法對數據集中的所有數據樣本進行預處理。
  • 動態樣本選擇模塊:從訓練集中檢索最相關的樣本,然后作為最直接的上下文(約束信息)送給大語言模型。
  • 布局序列化模塊:用于將上面所選的樣本布局轉化為序列表述(因為大語言模型對序列化輸入有更好的效果)。序列化數據就是類似 自然語言、代碼等
  • 大語言模型模塊:將序列化處理后的所有樣本一起送給大語言模型,讓大語言模型參考的情況下給出自己的答案。
  • 大語言模型解析模塊:用于將大語言模型給出的布局結果解析為標準化的輸出。
  • 布局排序模塊(布局評價模塊):評價大語言模型生成的布局的質量分數,并做一個排序。?

具體的模型圖如下:

模型運行具體流程如下:

  1. 用戶輸入前導信息,例如畫布大小,任務類型等,數據預處理模塊預處理數據庫(用戶根據自己的任務可以選擇數據庫,如海報布局數據庫、手機UI設計數據庫)中的所有數據。
  2. 動態樣本選擇模塊得到處理后的數據庫數據,然后根據用戶輸入的前導信息選擇合適的example樣本。
  3. 將樣本+前導信息+測試樣本送給大語言模型。
  4. 由大語言模型生成最終的layout,送給Rank模塊。
  5. Rank模塊排序后分數最高的就是最終輸出。

3. LayoutPrompt · 布局序列化模塊

布局序列化模塊:本質就是序列化+Prompt。兩者核心都是固定

序列化:將輸入輸出按照固定序列格式調整。

? ? ? ? 例如輸出固定如下:

  • "標題 0 0.1 0.2 0.3 0.4 | 正文 1 0.5 0.6 0.7 0.8"
  • # < html >
    # < body >
    # < div
    # style = "..." > 標題_0 < / div >
    # < div
    # style = "..." > 正文_1 < / div >
    # < / body >
    # < / html 

Prompt:根據不同任務,輸入需要不同Prompt,同時序列化格式。

? ? ? ? 例如輸入固定如下:

一句話來說,布局序列化模塊準備的就是模型中的這一部分:

  • 前導部分(PREAMBLE):固定Prompt,用戶輸入畫布大小高度等。
  • 輸入限制(INPUT CONSTRAINT) :會有兩種表示形式1.如上圖的seq形式;2.html形式。
  • 輸出布局(OUTPUT LAYOUT):得到布局的坐標data后(由其他模塊負責),序列化輸出上圖結果。

從代碼角度來說分為三個部分:

  • 固定化Prompt。
  • 父類序列化模塊(固定輸出序列結構,輸入序列留接口給子類實現)
  • 子類序列化模塊(一個子類對應一個具體的任務,不同任務輸入結構不一樣)

從任務角度存在以下七種:

  • 元素類型任務(限制layout中的元素)
  • 元素類型,元素尺寸限制任務
  • 元素類型,元素之間位置關系
  • 元素補全(根據部分已知布局元素,生成完整布局結構)
  • 元素尺寸修正(給出類型和尺寸,模型自己修正尺寸)
  • 防止遮擋的布局生成
  • 文本描述下的布局生成

3.1 固定化Prompt

PREAMBLE = ("Please generate a layout based on the given information. ""You need to ensure that the generated layout looks realistic, with elements well aligned and avoiding unnecessary overlap.\n""Task Description: {}\n""Layout Domain: {} layout\n""Canvas Size: canvas width is {}px, canvas height is {}px"
)
# html的頭部
HTML_PREFIX = """<html>
<body>
<div class="canvas" style="left: 0px; top: 0px; width: {}px; height: {}px"></div>
"""
# html的結尾
HTML_SUFFIX = """</body>
</html>"""# html的body
HTML_TEMPLATE = """<div class="{}" style="left: {}px; top: {}px; width: {}px; height: {}px"></div>
"""HTML_TEMPLATE_WITH_INDEX = """<div class="{}" style="index: {}; left: {}px; top: {}px; width: {}px; height: {}px"></div>
"""
  • 本部分主要是為了固定輸入輸出的一些序列化格式,同時固定前導部分
  • 用戶在這里通過前端輸入自己想要的畫布大小高度等信息。

3.2?父類序列化模塊

# 序列化的父類,后面有具體任務不同的序列化
# 所謂序列化本質就是固定輸入的prompt形式,同時固定輸出的一個形式。
class Serializer:def __init__(self,input_format: str,output_format: str,index2label: dict,canvas_width: int,canvas_height: int,add_index_token: bool = True,add_sep_token: bool = True,sep_token: str = "|",add_unk_token: bool = False,unk_token: str = "<unk>",):self.input_format = input_formatself.output_format = output_formatself.index2label = index2labelself.canvas_width = canvas_widthself.canvas_height = canvas_heightself.add_index_token = add_index_tokenself.add_sep_token = add_sep_tokenself.sep_token = sep_tokenself.add_unk_token = add_unk_tokenself.unk_token = unk_tokendef build_input(self, data):if self.input_format == "seq":return self._build_seq_input(data)elif self.input_format == "html":return self._build_html_input(data)else:raise ValueError(f"Unsupported input format: {self.input_format}")# check value is not nulldef _build_seq_input(self, data):raise NotImplementedErrordef _build_html_input(self, data):raise NotImplementedErrordef build_output(self, data, label_key="labels", bbox_key="discrete_gold_bboxes"):if self.output_format == "seq":return self._build_seq_output(data, label_key, bbox_key)elif self.output_format == "html":return self._build_html_output(data, label_key, bbox_key)# # 輸入數據結構示例# data = {#     "labels": [0, 1],  # 標簽索引#     "discrete_gold_bboxes": [  # 坐標列表(假設已離散化)#         [0.1, 0.2, 0.3, 0.4],#         [0.5, 0.6, 0.7, 0.8]#     ]# }# "標題 0 0.1 0.2 0.3 0.4 | 正文 1 0.5 0.6 0.7 0.8"def _build_seq_output(self, data, label_key, bbox_key):# 在字典中存儲的標簽信息,和邊框信息(不是存儲具體字,而是存儲信息)labels = data[label_key]bboxes = data[bbox_key]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]bbox = bboxes[idx].tolist()tokens.append(label)if self.add_index_token:tokens.append(str(idx))tokens.extend(map(str, bbox)) # extend一次性添加很多值,append一次添加一個值。map(function,list):把function作用在list上。str():將其他類型轉為str類型。if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token) # 添加隔離符號return " ".join(tokens)# # 輸出結構# < html ># < body ># < div# style = "..." > 標題_0 < / div ># < div# style = "..." > 正文_1 < / div ># < / body ># < / html >def _build_html_output(self, data, label_key, bbox_key):labels = data[label_key]bboxes = data[bbox_key]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]  # 使用 HTML_PREFIX 作為 HTML 頁面的開頭,并將畫布寬度和高度傳遞進去。_TEMPLATE = HTML_TEMPLATE_WITH_INDEX if self.add_index_token else HTML_TEMPLATE # 根據 add_index_token 決定使用哪種模板:帶索引的模板或普通模板。for idx in range(len(labels)):label = self.index2label[int(labels[idx])]bbox = bboxes[idx].tolist()element = [label]if self.add_index_token:element.append(str(idx))element.extend(map(str, bbox))htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)return "".join(htmls)
  • 主要定義兩種輸出方式的序列化。第一種是以seq的形式輸出;第二種是以html的形式輸出。
  • 輸入形式的序列化(prompt+序列化)僅僅定義了模板交給子類(具體任務)來實現。
  • expand和append都是列表后追加,但expand一次追加很多個元素,append一次加一個。
  • map(function,list):將function作用在所有的list元素上。
  • 作用:1.?得到其他模塊給的Layout坐標data后,將其轉化為html或seq的固定序列化格式輸出。2.作為父類將輸入序列化交給子類實現。

3.3?子類序列化模塊

????????前面也說了,子類序列化模塊需要根據不同的任務要求給出不同的prompt以及序列化輸入。因此有多少個任務就會有多少個子類序列化模塊。在這里,貓貓僅僅展示兩個模塊的代碼,完整的代碼等專欄更新結束后,會同步放在Gitee以及CSDN賬號下。

任務一:限制元素類型的布局生成

class GenTypeSerializer(Serializer):task_type = "generation conditioned on given element types"constraint_type = ["Element Type Constraint: "]HTML_TEMPLATE_WITHOUT_ANK = '<div class="{}"></div>\n'HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEX = '<div class="{}" style="index: {}"></div>\n'def _build_seq_input(self, data):labels = data["labels"]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]tokens.append(label)if self.add_index_token:tokens.append(str(idx))if self.add_unk_token:tokens += [self.unk_token] * 4if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token)return " ".join(tokens)def _build_html_input(self, data):labels = data["labels"]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]if self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATE_WITH_INDEXelif self.add_index_token and not self.add_unk_token:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEXelif not self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATEelse:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANKfor idx in range(len(labels)):label = self.index2label[int(labels[idx])]element = [label]if self.add_index_token:element.append(str(idx))if self.add_unk_token:element += [self.unk_token] * 4htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)return "".join(htmls)def build_input(self, data):return self.constraint_type[0] + super().build_input(data)

任務二:限制元素類型,以及元素關系的布局生成

class GenRelationSerializer(Serializer):task_type = ("generation conditioned on given element relationships\n""'A left B' means that the center coordinate of A is to the left of the center coordinate of B. ""'A right B' means that the center coordinate of A is to the right of the center coordinate of B. ""'A top B' means that the center coordinate of A is above the center coordinate of B. ""'A bottom B' means that the center coordinate of A is below the center coordinate of B. ""'A center B' means that the center coordinate of A and the center coordinate of B are very close. ""'A smaller B' means that the area of A is smaller than the ares of B. ""'A larger B' means that the area of A is larger than the ares of B. ""'A equal B' means that the area of A and the ares of B are very close. ""Here, center coordinate = (left + width / 2, top + height / 2), ""area = width * height")constraint_type = ["Element Type Constraint: ", "Element Relationship Constraint: "]HTML_TEMPLATE_WITHOUT_ANK = '<div class="{}"></div>\n'HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEX = '<div class="{}" style="index: {}"></div>\n'def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.index2type = RelationTypes.index2type()def _build_seq_input(self, data):labels = data["labels"]relations = data["relations"]tokens = []for idx in range(len(labels)):label = self.index2label[int(labels[idx])]tokens.append(label)if self.add_index_token:tokens.append(str(idx))if self.add_unk_token:tokens += [self.unk_token] * 4if self.add_sep_token and idx < len(labels) - 1:tokens.append(self.sep_token)type_cons = " ".join(tokens)if len(relations) == 0:return self.constraint_type[0] + type_constokens = []for idx in range(len(relations)):label_i = relations[idx][2]index_i = relations[idx][3]if label_i != 0:tokens.append("{} {}".format(self.index2label[int(label_i)], index_i))else:tokens.append("canvas")tokens.append(self.index2type[int(relations[idx][4])])label_j = relations[idx][0]index_j = relations[idx][1]if label_j != 0:tokens.append("{} {}".format(self.index2label[int(label_j)], index_j))else:tokens.append("canvas")if self.add_sep_token and idx < len(relations) - 1:tokens.append(self.sep_token)relation_cons = " ".join(tokens)return (self.constraint_type[0]+ type_cons+ "\n"+ self.constraint_type[1]+ relation_cons)def _build_html_input(self, data):labels = data["labels"]relations = data["relations"]htmls = [HTML_PREFIX.format(self.canvas_width, self.canvas_height)]if self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATE_WITH_INDEXelif self.add_index_token and not self.add_unk_token:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANK_WITH_INDEXelif not self.add_index_token and self.add_unk_token:_TEMPLATE = HTML_TEMPLATEelse:_TEMPLATE = self.HTML_TEMPLATE_WITHOUT_ANKfor idx in range(len(labels)):label = self.index2label[int(labels[idx])]element = [label]if self.add_index_token:element.append(str(idx))if self.add_unk_token:element += [self.unk_token] * 4htmls.append(_TEMPLATE.format(*element))htmls.append(HTML_SUFFIX)type_cons = "".join(htmls)if len(relations) == 0:return self.constraint_type[0] + type_constokens = []for idx in range(len(relations)):label_i = relations[idx][2]index_i = relations[idx][3]if label_i != 0:tokens.append("{} {}".format(self.index2label[int(label_i)], index_i))else:tokens.append("canvas")tokens.append(self.index2type[int(relations[idx][4])])label_j = relations[idx][0]index_j = relations[idx][1]if label_j != 0:tokens.append("{} {}".format(self.index2label[int(label_j)], index_j))else:tokens.append("canvas")if self.add_sep_token and idx < len(relations) - 1:tokens.append(self.sep_token)relation_cons = " ".join(tokens)return (self.constraint_type[0]+ type_cons+ "\n"+ self.constraint_type[1]+ relation_cons)
  • 針對此任務設計了具體的Prompt形式。
  • 輸入數據序列化有兩個部分:1、seq序列化;2、html序列化
  • seq序列化:用戶輸入限制后,需要結合Prompt序列化到INPUT_CONSTRAINT(
  • (注意:這個seq并不是完整的,僅僅是將用戶的限制要求填入):
  • html序列化:根據用戶輸入限制生成對應的html格式(注意:這個html并不是完整的,僅僅是將用戶的限制要求填入)
  • 作用:1.將用戶輸入的限制轉化為某種序列化(seq序列化 或 html序列化)。2.結合固定Prompt包裝成完整的INPUT CONSTRAINT

4. 總結

本篇文章帶大家深入了解了PosterGenius項目的Layout生成部分的第一篇,后續將更新Layout系列的第二篇。歡迎大家繼續支持貓貓呀!!

?【如果想學習更多深度學習文章,可以訂閱一下熱門專欄】

  • 《PyTorch科研加速指南:即插即用式模塊開發》_十二月的貓的博客-CSDN博客
  • 《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客
  • 《AI認知筑基三十講》_十二月的貓的博客-CSDN博客

如果想要學習更多pyTorch/python編程的知識,大家可以點個關注并訂閱,持續學習、天天進步你的點贊就是我更新的動力,如果覺得對你有幫助,辛苦友友點個贊,收個藏呀~~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78848.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Compose筆記(二十)--TextField

這一節主要了解一下Compose的TextField,TextField 是一個用于接收用戶文本輸入的 UI 組件,允許用戶通過鍵盤輸入、編輯或刪除文本。簡單用法總結如下: API value&#xff1a;當前輸入的文本內容。 onValueChange 含義&#xff1a;當用戶輸入文本時觸發的回調函數&#xff0c;參…

在Linux虛擬機下使用vscode,#include無法跳轉問題

總結&#xff1a;需要通過Linux指令來添加編譯器和壓縮文件&#xff0c;解壓&#xff0c;這樣獲得的編譯器會具有可執行權限類似于 -rwxr-xr-x 1 user user 12345 Apr 26 14:22 myscript.sh 如果你直接從window中拖入文件到Linux文件下&#xff0c;你需要自己來再度開啟可編譯…

ArcGIS+GPT:多領域地理分析與決策新方案

技術點目錄 AI大模型應用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力數據讀取AI助力數據編輯與處理AI助力空間分析AI助力遙感分析AI助力二次開發AI助力科研繪圖ArcGISAI綜合應用了解更多 ——————————————————————————————————…

基礎術語說明

車間&#xff1a;工廠內集中進行加工或裝配的獨立空間&#xff0c;配備設備、工具及人員&#xff0c;是生產活動的核心載體。 比如裝配車間、總裝車間、油漆車間等 生產線&#xff1a;以流水作業形式將原材料轉化為成品的設備與人員的組合系統&#xff0c;強調連續性和效率。…

Splunk 使用Role 實現數據隔離

很多人知道 Splunk 有很多自帶的Role, 今天我就要說說定制化的Role: 1: 在創建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 創建好新Role 后,在SAML 添加新的group 的時候,就可以看到Role 給某個group: 4: 這樣一個特定組的人來申請Splunk 權限,就可…

利用李雅普諾夫穩定性理論設計模型參考自適應系統(2.0)

上一篇介紹了利用李雅普諾夫穩定性理論設計模型參考自適應系統&#xff0c;通過在被控對象前面添加一個可調增益&#xff0c;然后利用李雅普諾夫穩定性理論設計增益的自適應率&#xff0c;使得被控對象輸出與參考模型輸出一致。本文將介紹在系統結構中引入前饋和反饋的結構&…

前端封裝WebSocket工具n

Web API 提供的 WebSocket 類&#xff0c;封裝一個 Socket 類 // socket.js import modal from /plugins/modal const baseURL import.meta.env.VITE_APP_BASE_WS; const EventTypes [open, close, message, error, reconnect]; const DEFAULT_CHECK_TIME 55 * 1000; // 心…

TCP和UDP傳輸層協議

TCP&#xff08;Transmission Control Protocol&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff09;是兩種常見的傳輸層協議&#xff0c;它們在網絡通信中發揮著不同的作用。二者在連接建立、可靠性、傳輸效率等方面存在顯著差異&#xff0c;適用于不同的應用場…

空域倫理與AI自主邊界的系統建構

在AI無人系統逐步參與城市空域治理的過程中&#xff0c;系統的“自主性”已不再僅是技術指標&#xff0c;而是直接影響合規性、安全性與社會接受度的倫理邊界議題。AI決策系統是否擁有“強干預能力”&#xff1f;行為觸發責任應歸屬何方&#xff1f;算法可否調優至“自我糾偏”…

在原生代碼(非webpack)里使用iview的注意事項

最近公司在做一個項目&#xff0c;使用的框架是iview,使用過程中同事遇到一些問題&#xff0c;這些問題對于有些同學來說根本就不是問題&#xff0c;但總會有同學需要&#xff0c;為了幫助不太會用的同學快速找到問題&#xff0c;做了如下整理&#xff1a; 下載vue,iview.min.j…

java代碼混淆

生成jar的時候混淆 目前最常用的Proguard,網上有很多介紹的文章&#xff0c;這種安全性較低 對已經生成的jar進行加密 加密庫:https://github.com/li571312729/classfinal 測試對jar進行加密 加密后如果正常調用的話會失敗 加密后jar反編譯查看不到代碼 使用密碼才能調用機…

【Linux】第十三章 訪問Linux文件系統

目錄 1. 存儲設備是什么&#xff1f;怎么理解分區和格式化&#xff1f; 2. 文件系統是什么&#xff1f; 3. 掛載是什么&#xff1f;掛載點是什么&#xff1f; 4. 怎么理解塊設備&#xff1f; 5. 在SATA附加存儲中&#xff0c;第一磁盤上的第一個分區和第二磁盤的第二個分區…

MCP 服務器搭建【stdio 類型】實現上市公司年報查詢總結,配合 Cherry Studio使用簡單

代碼解釋 這段 Python 代碼的主要功能是搭建一個基于 FastAPI 的 MCP 服務器,用于處理通過股票代碼查詢上市公司年報的請求,實現服務器向客戶端的實時消息推送。以下是對代碼各部分的詳細解釋: 完整代碼+使用 Cherry Studio 調用 MCP 服務器的方法,放在文章最后了 1. 導…

第六節:軟件安裝

理論知識 軟件安裝的方式&#xff1a;在 Linux 系統中&#xff0c;常見的軟件安裝方式有源碼安裝、在線安裝、deb 包安裝、RPM 包安裝、使用 Snap 管理軟件包等。不同的安裝方式適用于不同的軟件和場景。源碼安裝&#xff1a;源碼安裝是指從軟件的源代碼開始&#xff0c;進行編…

ubantu部署yolov5(第四集:模型加速)

參考鏈接&#xff1a; GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite TFLite,ONNX,CoreML,TensorRT Export -Ultralytics YOLO Docs 使用Neural Magic 的 DeepSparse 部署YOLOv5 -Ultralytics YOLO 文檔 sparseml/inte…

flutter 專題 五十六 Google 2020開發者大會Flutter專題

由于疫情的原因&#xff0c;今年的Google 開發者大會 (Google Developer Summit) 在線上舉行&#xff0c;本次大會以“代碼不止”為主題&#xff0c;全面介紹了產品更新以及一系列面向本地開發者的技術支持內容。我比較關注的是移動開發&#xff0c;在本次大會上&#xff0c;關…

開源模型應用落地-qwen模型小試-Qwen3-8B-快速體驗-pipeline方式(二)

一、前言 阿里云最新推出的 Qwen3-8B 大語言模型,作為國內首個集成“快思考”與“慢思考”能力的混合推理模型,憑借其 80 億參數規模及 128K 超長上下文支持,正在重塑 AI 應用邊界。該模型既可通過輕量化“快思考”實現低算力秒級響應,也能在復雜任務中激活深度推理模式,以…

「動態規劃::背包」01背包 / AcWing 2(C++)

概述 AcWing 2&#xff1a; 有 N 件物品和一個容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的體積是 v[i]&#xff0c;價值是 w[i]。 求解將哪些物品裝入背包&#xff0c;可使這些物品的總體積不超過背包容量&#xff0c;且總價值最大。 輸出最大價值。 輸入格式 第一…

Java 中的 設計模式詳解

一&#xff1a;設計模式概述 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;分類 創建型 行為型 結構型 二&#xff1a;軟件設計模式 2.1 開閉原則 &#xff08;1&#xff09;定義 在程序需要進行拓展的時候&#xff0c;不能修改原有代碼 使用到接口和抽象類&#x…

阿里qiankun微服務搭建

主服務 chat vue3 ts vite 子服務 ppt react 18 vite 子服務 agent 主服務 npm i vite-plugin-qiankun mian.ts import ./style/base.scss import virtual:svg-icons-register import { createApp } from vue import { createPinia } from piniaimport App from ./App.vue im…