回想起以前似是而非做的題,現在有必要耐下性子,總結一下!
要投入熱情了。
題意:
有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,表示...