1146 採藥 詳解

2021-05-26 10:26:19 字數 930 閱讀 7561

回想起以前似是而非做的題,現在有必要耐下性子,總結一下!

要投入熱情了。

題意: 

有m組藥,給出採這個藥的時間time 和 這個藥的價值value。

(題外意:每個藥只有乙個)問在給分定時間t內如何採藥可以達到最大價值。

即求規劃m組藥中的乙個子集,使在t時間內,所取子集的價值和最大。

分析:歸類:0-1揹包問題。即根據揹包的大小,乙個物品只能為放入(1) ,和不放入(0),兩種狀態。

狀態:s( i , j )  表示 前 i 組藥,在時間 j 時的最大價值。

0 =< i < m          0 =< j <=t

1.如果 time_i  大於 j ,則 s( i ,j) = s(i - 1 , j)

2.如果time_i   小於等於 j,

若不包含第 i 株 ,其價值為 s(i -1 , j)

若包含第 i 株,    其價值為 s(i - 1 ,j - time_i)  +  value_i    

s(i ,j)選上述較大者。

公式:乙個例項:

該例項截圖**:

#include#includeint t , m ;

//甚至可以不用儲存輸入

//儲存所有路徑的演算法

int s[101][1005];

int main ()}}

printf("%d\n",s[m][t]);

}

#include#includeint t , m ;

//使用乙個陣列儲存

//但每次更新需從頂端開始,因為需要用低位資料

int s[1001];

int main ()

} printf("%d\n",s[t]);

}

1146 快照陣列

題目描述 實現支援下列介面的 快照陣列 snapshotarray snapshotarray int length 初始化乙個與指定長度相等的 類陣列 的資料結構。初始時,每個元素都等於 0。void set index,val 會將指定索引 index 處的元素設定為 val。int snap ...

luogu1146 硬幣翻轉

時空限制 1000ms 128mb 在桌面上有一排硬幣,共n枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 輸入格式 輸入只有一行,包含乙個自然數n n為不...

洛谷1146 硬幣翻轉

在桌面上有一排硬幣,共nn枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 乙個自然數nn nn為不大於100100的偶數 第一行包含乙個整數ss,表示...