日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

习题整理(简单01背包 可用查并集2022/4/24)

發布時間:2024/3/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 习题整理(简单01背包 可用查并集2022/4/24) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

習題整理

提示:之前的習題在習題集合


文章目錄

  • 習題整理
  • 一、誘人的寶藏
    • 1.思路
    • 2.代碼
  • 二、晚宴
    • 1.思路
    • 2.代碼
  • 三、醫師之路
    • 1.思路
    • 2.擴展知識
    • 3.代碼
  • 總結


提示:以下是本篇文章正文內容,下面案例可供參考

一、誘人的寶藏

題目:勇敢的小明來到一個失落的村莊。他非常幸運,找到了很多寶藏和一個空的大鐵箱,但是失落的村莊里有很多憤怒的僵尸。小明非常勇敢,他決定打敗僵尸,然后把所有的寶藏都帶回來。一場曠日持久的殘酷戰斗從早到晚持續,最后小明發現僵尸是不死的,不可戰勝的。
但是,這些寶藏不應該留在這里。不幸的是,由于大鐵箱容量的限制,小明無法攜帶所有寶藏。村莊里的寶藏只有兩種:祖母綠寶石和藍寶石。所有的寶石在大小和價值上都是相等的,數量是無窮的。
聰明得你,能不能考慮到箱子的大小、每種寶石的價值和大小,計算出我們的勇士小明能帶回的寶藏的最大價值。

輸入輸出格式
輸入格式
輸入只有一行,包含五個整數 N,S1,V1 ,S2,V2
?,表示寶箱的大小為 N,祖母綠寶石的大小和價值為 S1
和V1,藍寶石的大小和價值為 S2和 V 2。所有整數都是正整數。整數之間以空格間隔。
輸出格式
針對輸入,打印出小明可以隨身攜帶的所有寶藏的最大總值。
輸入輸出樣例1
輸入
100 1 1 2 2
輸出
100

1.思路

  • 這道題本身其實是弱化的01背包問題,但我們不用動態規劃做。而是換一個思路。 我們只需要考慮兩種情況
  • 第一種先裝綠寶石裝到裝不下,剩余的空間去裝藍寶石
  • 第二種先裝藍寶石裝到裝不下,剩余的空間去裝綠寶石 然后我們比較這兩種情況,哪一種的價值最大?輸出即可

2.代碼

代碼如下:

a=input() #輸入的那一行就是背包容量,綠寶石重量和價值,藍寶石的重量和價值 a=a.split() #以空格作為分隔符,將整個字符串分割成列表返回 a=[int(i) for i in a] b=max((a[0]//a[1])*a[2]+((a[0]%a[1])//a[3])*a[4],(a[0]//a[3])*a[4]+((a[0]%a[3])//a[1])*a[2])#這一句就是判斷那兩種情況,哪一種的價值更大? #(a[0]//a[1])*a[2]+((a[0]%a[1])//a[3])*a[4]先裝綠寶石,再裝藍寶石 print(b)

二、晚宴

題目:今天是小明的生日,他邀請了很多朋友。到了吃晚飯的時間,小明想知道他至少需要多少張桌子。你必須知道,并不是所有的朋友都認識彼此,而且所有的朋友都不想和陌生人待在一起。
這個問題的一個重要規則是,如果我告訴你 A 認識 B,B 認識 C,這意味著 A,B,C 相互認識,所以他們可以待在一張桌子上。
例如:如果我告訴你 A 知道 B,B 知道 C,D 知道 E,那么 A,B,C 可以待在一張桌子上,而 D,E 必須待在另一張桌子上。所以小明至少需要兩張桌子。

輸入輸出格式
輸入格式
第一行有兩個整數 n 和 m,分別表示朋友的數量和朋友之間關系的數量,朋友標記為從 1 到 n;
然后是 m 行。每一行由兩個整數 A 和 B(A!=B) 組成,這意味著朋友 A 和朋友 B 彼此認識。
整數之間以空格間隔。

輸出格式
針對輸入,打印出小明最少需要多少張桌子。

輸入輸出樣例1
輸入
5 3
1 2
2 3
4 5
輸出
2

1.思路

  • 這道題理清邏輯后還是比較簡單的
  • 首先要先確定一點,最初始有n個朋友就需要有n張桌子,因為我們不確定他們認不認識?
  • 接下來會有n對關系,只分兩種情況
  • 第一種是兩個元素,之前都沒出現過,再給出這段關系后,他們兩個就可以坐一張桌子,原本兩個人要兩張桌子,現在兩個人要一張桌子,所以桌子數量減一
  • 第二種是兩個元素,之前出現過一個元素,然后又有一個新的元素,這個時候我們就要新的元素,跟那個老的元素去做一張桌子,所以也是桌子數量減一
  • 根據這個關系,我們可以看出來,無論是哪一種情況,其實都是桌子的數量減一,所以我們直接拿朋友的總數減去出現的關系數目就可以了.
  • 以這道題的輸出樣例來解釋,剛開始輸入有五個朋友,所以初始有五張桌子
  • 然后有三對關系,第一對出現了1和2,所以1和2可以坐一張桌子。兩個人去坐一張桌子,省去了一張桌子,所以桌子數量減一。
  • 第二對關系,是2和3。2之前出現過3是新的朋友,根據題里的規則,3可以去和1,2坐一張桌子,所以又省去了一張桌子。
  • 第三對關系,4和5就同第一對關系一樣減去一張桌子。所以就是,五個人減去三對關系,得兩張桌子

2.代碼

代碼如下:

b=input() b=b.split() b=[int(i) for i in b] print(b[0]-b[1]) #無論是哪一種情況,其實都是桌子的數量減一,所以我們直接拿朋友的總數減去出現的關系數目

三、醫師之路

題目:
小明從小的夢想就是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大?!?br /> 如果你是小明,你能完成這個任務嗎?

輸入輸出格式
輸入格式
輸入第一行包含 2 個整數 t 和 m,t 表示總共能夠用來采藥的時間,m 表示山洞里的草藥的數目。
接下來輸入 m 行,每行包括 2 個整數 c 和 v,分別表示采摘某株草藥的時間和這株草藥的價值。
整數之間以空格間隔。
輸出格式
針對輸入,打印出小明在規定的時間內可以采到的草藥的最大總價值。

輸入輸出樣例1
輸入
70 3
71 100
69 1
1 2
輸出
3

1.思路

這道題的題型主要就是01背包問題,他只不過是把01背包問題里面的體積換成了時間。
接下來我會分別介紹如何用動態規劃解這道題和01背包問題的模板。
動態規劃簡單來說就是我們利用歷史數據去推出新的數據來,減少我們的計算量。
我也不會著重介紹,最優子結構跟重復子問題,我就簡單講一下,怎么解題?
動態規劃的題可以分為三部:
第一步我們要確定我們數組里的每個元素代表的是什么含義
第二步,我們要確定初始值該怎么設立?
第三步,我們要確定如何用歷史數據去推出新的數據。
我會以下面這道題為例,講一下上面三個步驟該如何去做。
第一步,我們設一個二維數組dp,dp[i][j]代表的元素就是在我時間j范圍內,采集i個藥草,所能采集到的最大價值。
第二步,由于我一開始i=0的時候,我的價值肯定是零,所以我的初始值就是零。
第三步,我們如何從歷史數據中推出新的數據呢?我們要分兩種情況。就是我第i個藥材采還是不采?在此之前,我們首先要判斷我們現在的時間j是否大于采集第i個藥材所需的時間。如果小于的話,我肯定是不能踩的了。所以我的最大價值肯定是,在相同時間內,前i-1個藥材的最大價值。
如果我的時間大于了第i個草的時間我會去比較,我采第i個藥草和不采第i個藥草,那個價值哪個更高?取最大的就ok??赡苡型瑢W認為采第i個藥草,肯定價值要更大呀。
但我們要注意一點,我們采摘藥草是有時間限制的,所以如果我們要采第i個藥草,我們就要去把空出第i個藥草時間。采第i個藥草價值,就是減j減去采第i個藥草的時間下標的價值,加上第i個藥草價值。

2.擴展知識

(1)np.zeros()的作用
返回來一個給定形狀和類型的用0填充的數組
zeros(shape, dtype=float, order=‘C’)
shape:表示形狀
dtype:數據類型,可選參數,默認numpy.float64
order:可選參數,c代表行優先;F代表列優先
(2)01背包問題

  • 在解決問題之前,為描述方便,首先定義一些變量:Vi表示第 i 個物品的價值,Wi表示第 i 個物品的體積,定義V(i,j):當前背包容量
    j,前 i 個物品最佳組合對應的價值,同時背包問題抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 個物品選或不選)。
  • 尋找遞推關系式,面對當前商品有兩種可能性:
    包的容量比該商品體積小,裝不下,此時的價值與前i-1個的價值是一樣的,即V(i,j)=V(i-1,j);
  • 還有足夠的容量可以裝該商品,但裝了也不一定達到當前最優價值,所以在裝與不裝之間選擇最優的一個,即
    V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
    其中V(i-1,j)表示不裝,V(i-1,j-w(i))+v(i) 表示裝了第i個商品,背包容量減少w(i),但價值增加了v(i);
    由此可以得出遞推關系式:
j<w(i) V(i,j)=V(i-1,j) j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)
  • 這里需要解釋一下,為什么能裝的情況下,需要這樣求解(這才是本問題的關鍵所在!):
    可以這么理解,如果要到達V(i,j)這一個狀態有幾種方式?
  • 肯定是兩種,第一種是第i件商品沒有裝進去,第二種是第i件商品裝進去了。沒有裝進去很好理解,就是V(i-1,j);裝進去了怎么理解呢?如果裝進去第i件商品,那么裝入之前是什么狀態,肯定是V(i-1,j-w(i))。由于最優性原理(上文講到),V(i-1,j-w(i))就是前面決策造成的一種狀態,后面的決策就要構成最優策略。兩種情況進行比較,得出最優。

01背包問題鏈接:https://blog.csdn.net/qq_38410730/article/details/81667885

3.代碼

代碼如下:

import numpy as n dp=n.zeros((1000,1000),dtype=int)#這一步是創建一個int類型二維的dp數組,1000行1000列。 yao=n.zeros((100,2),dtype=int) a=input() a=a.split()#以空格為分隔,符將字符串分割成一個列表返回 t=int(a[0]) m=int(a[1]) for i in range(1,m+1):#這一部是輸入所有藥材采集的時間和價值 a=input() a=a.split() yao[i][0]=int(a[0]) yao[i][1]=int(a[1]) for i in range(1,m+1):#01背包模板 for j in range(1,t+1): if(j<yao[i][0]): dp[i][j]=dp[i-1][j] else: dp[i][j]=dp[i-1][j] if dp[i-1][j]>dp[i-1][j-yao[i][0]]+yao[i][1] else dp[i-1][j-yao[i][0]]+yao[i][1]#if的緊湊形式 print(dp[m][t])

總結

提示:技術太菜,后期補充,懇請大佬指正

總結

以上是生活随笔為你收集整理的习题整理(简单01背包 可用查并集2022/4/24)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。