動態規劃(DP)入門必做題目------ 開心的金明

題目: P1060 開心的金明

地址:https://www.luogu.org/problemnew/show/P1060

今天做了傳說中的DP,儘管是最簡單的01被揹包問題,但是仍然可以得到很多,聽再多遍不會自己練一遍。這次真正的明白了找出轉移方程的重要性。動態方程就是解題的關鍵。以二維數組表示總價值。
即dp[i][j]。所謂的動態規劃實質上也就是以二分的思想,將總體到部分的方法!!從而將時間複雜度降到了logn的程度!

dp不是算法,而是一個多階段求解方法。
貼上dp的處代碼!

#include <iostream>
using namespace  std;
int dp[30][30001],m,n,v,p;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)   //列舉買每一個物品的情況(可以優化)
    {
        cin>>v>>p;
        for(int j=1;j<=n;j++)  //列舉小於n的金額
        if(v<=j)   //如果說,該物品價值可以被購買,則在購買於不購買的兩種情況下找到最優解!
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+v*p);  //這裏就是傳說中的轉移方程!
        else dp[i][j]=dp[i-1][j];
    }
    cout<<dp[m][n];  //輸出最優解(最大價值)!
    return 0;
}

儘管很簡單但是最起碼知道dp是什麼了!QAQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章