題目: 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