2021-01-05
阿新 • • 發佈:2021-01-06
技術標籤:演算法
01揹包動態規劃
粗略翻閱過了一些文章,發現沒有一篇特別容易理解的,所以打算寫一寫
第一
這種問題不僅僅是有一個揹包,有一定的容量,有一些價值不同的物體,需要佔據不同的容量,問揹包容納物體的最大價值,還可以是採藥時間有限,採藥價值不同等等。
第二
由於所見文章對於此問題解釋都比較專業,這裡就直接解釋一個小點。
揹包需要比較容納量和價值,這時候就設一個二維陣列,不好說啊,上題
1033.採藥
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 909 Accepted Submission(s): 361Description
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裡對他說:“孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是一個聰明的孩子,你應該可以讓採到的草藥的總價值最大。”
如果你是辰辰,你能完成這個任務嗎?
Input
輸入的第一行有兩個整數T(1 <= T <= 1000)和M(1 <= M <= 100),用一個空格隔開,T代表總共能夠用來採藥的時間,M代表山洞裡的草藥的數目。接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間(1 <= t <= T)和這株草藥的價值(1 <= v <= 100000)。
輸出包括一行,這一行只包含一個整數,表示在規定的時間內,可以採到的草藥的最大總價值。
Sample Input
100 5
77 92
22 22
29 87
50 46
99 90
Sample Output
133
程式碼
#include<bits/stdc++.h>
using namespace std;
int t[105],v[105];
int m[105][1010]={0};
int main()
{
int T,M;
cin>>T>>M;
for(int i=1;i<=M;i++)cin>>t[i]>>v[ i];
for(int i=1;i<=M;i++)
{
for(int j=1;j<=T;j++)
{
if(j>=t[i])
m[i][j]=max(m[i-1][j],m[i-1][j-t[i]]+v[i]);
else
m[i][j]=m[i-1][j];
}
}
cout<<m[M][T]<<endl;
return 0;
}
這裡面的二維陣列中,m[i][j];i表示第i個物體,j表示時間j,不到時間j就不能採,如果比j小的話,那麼,現在就還是上一株藥被採下來的總價值,如果如果比j大的話,就看m[i][j]=max(m[i-1][j],m[i-1][j-t[i]]+v[i]);也就是看一看如果採下這株藥的話,這株藥和所剩空間能採的藥價值的和跟之前不採這株藥相比哪個大。