每一個物品有三個屬性,「所含卡路里」:價值\(v\),「體積」:限制1\(m_1\),以及「質量」:限制2\(m_2\),在n件物品中選擇一部分,使得所選物品價值\(v\)之和最大。
同時要求這些物品的限制1\(m_1\)之和不超過限制1上限\(c_1\),限制2\(m_2\)之和不超過限制2上限\(c_2\)。c++
輸入包括n+2行。
第一行包括兩個整數\(c_1,c_2(c_1,c_2<400)\)
第二行包括一個整數\(n(n<50)\)
下面n行,每行包括三個整數\(m_1,m_2,v(m_1,m_2<400,v<500)\)優化
輸出知足條件的最大的\(v\)之和spa
看題目能大致猜到是一道揹包題。可是與揹包不同的是,限制有兩個。
類比普通揹包問題中通常設\(dp[i]\)表示限制爲\(i\)時的最優解,那麼咱們這裏能夠設\(dp[i][j]\)表示限制分別爲\(i\)和\(j\)時的最優解。
下面考慮轉移方程式。因爲選擇一個物品會將兩個限制都減小,因此能夠獲得轉移式爲\(dp[i][j]=max(dp[i][j],dp[i-m1[k]][j-m2[k]]+v[k])\)其中k表示考慮第k個物品。code
#include<bits/stdc++.h> using namespace std; int c1,c2,n; int m1,m2,v; int f[402][402]; int main(){ cin>>c1>>c2>>n; for(int k=1;k<=n;k++){ cin>>m1>>m2>>v; for(int i=c1;i>=m1;i--) for(int j=c2;j>=m2;j--){ f[i][j]=max(f[i][j],f[i-m1][j-m2]+v); } } cout<<f[c1][c2]; }
到這裏,題已經作出來了。經過這兩天刷的這些題,你們應該找到了揹包問題的通解。在這裏總結一下。隊列