演算法學習之路的心得三之動態規劃

2021-10-19 20:31:25 字數 1442 閱讀 7806

1.總結

2.題目題解

我個人覺得動態規劃是乙個很難的演算法,主要是分支太多太多,題型千變萬化,目前,我做題的話,學過或者做過類似的題目還好說,沒做過的話,想是很難想出來的。做動態規劃的題目,最重要的還是找到狀態方程,這樣才能一步一步把答案推出來,不然沒法做。反正吧,動態規劃沒有什麼固定的知識點或者什麼模板之類的,只能在題目中一點一點的摸索出來。

題目鏈結

題目描述:現在我們有n個配件,他們有不同的價值. 但是我們揹包的容量是有限的,因為我們只有乙個一級包, 所以我們最多可以裝v重量的東西. 但是為了能更好的吃到雞(不存在的)我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢??

題目思路:這是乙個經典的0 1 揹包問題如果 j=v[i] (當前容量可以裝下該東西),就判斷要這個東西能拿到更多的價值還是不要這個東西能拿到更多的價值 ( dp[i] [j]=max(dp[i-1] [j],dp[i-1] [j-v[i]]+w[i]) )這個也是解dp題最關鍵的狀態方程,用兩層迴圈,從左往右 從上往下不斷更新dp答案,最後輸出dp[ n ] [ m ] 既是題目要求的答案了。

ac**:

#include #include using namespace std;

int dp[1005][1005],n,v;

int v[1005],w[1005];

int max(int a,int b)

int main()

for(int i=1;i<=n;i++)

for(int i=0;i<=n;i++)

for(int i=1;i<=n;i++)

int main()

for(int i=0;i<=m;i++)

} for(int i=0;i0)

}} int p=0,i,num;

for(i=n;i>0;i--)

} int t=m;

while(num)

t--;

} int sum=0;

for(int i=p-1;i>=0;i--)

sum[1]=a[1];

max[1]=a[1];

p=1;

for(int i=2;i<=n;i++)

}if(t==0)

else

}ll ans=sum[1];

for(int i=2;i<=p;i++)

a[0]=0;

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

else if(j-p[i]>=0&&a[j-p[i]]>0)}}

int ans=0;

for(i=1;i<=m;i++)

}cout

} return 0;

}

演算法學習之動態規劃(二)

神奇的口袋 有乙個神奇的口袋,總的容積為40,用這個口袋可以變出一些物品,這些物品的體積分別為a 1 a 2 a 3 a n john可以從這些物品中選擇一些,如果選出的物體的總體積為40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。遞推的...

演算法學習 動態規劃

動態規劃是解決多階段決策過程最優化的一種方法。對於離散問題,解析數學無法施展,動態規劃則成為非常有效的工具。兩個弱點 1.得出目標函式方程後,尚無統一的處理方法,必須根據具體問題的性質結合相應的數學技巧來求解 2.維數障礙。動態規劃模型的分類 根據決策過程的時間參量是離散的還是連續的變數 1.離散 ...

演算法學習 動態規劃實踐

完成日期 2017.10.26 1.實踐題目 數字三角形 2.問題描述 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。3.演算法描述 1 首先該問題有最優子結構和重疊子問題的性質,因...