原題傳送門ios
這道題一看就是個0-1揹包的模板題,大犇們一看就懂(然而像我這種蒟蒻作了一個小時才作出來......逃~~~)spa
設dp[i][j]爲前i個物體裝入容量爲j的揹包的最大價值,w[i],v[i]分別爲第i個物品的重量和價格。
那麼dp[n][W]即爲所求。(n爲個數,W爲容量)。code
分兩種狀況:
不裝入,那麼dp[i][j]就等於dp[i-1][j]。
裝入,那麼dp[i][j]就等於dp[i-1][j-w[i]]+v[i]。get
若容量j<w[i],則沒法裝,只能選擇狀況1。
不然取兩種狀況中價值最大者。io
故狀態轉移方程爲:模板
dp[i][j]=dp[i-1][j] (j<w[i]) dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]} (j≥w[i])
剩下的就是小菜一碟卻花了本蒟蒻30+min的Code了。class
//經典揹包,無需解釋 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int T,M,w[101],v[101],dp[101][1001]; int main() { //初始化 for(int i=1;i<=M;i++) { dp[i][0]=0; } for(int i=1;i<=T;i++) { dp[0][i]=0; } //讀入 scanf("%d%d",&T,&M); for(int i=1;i<=M;i++) { scanf("%d%d",&w[i],&v[i]); } //裝叉走起 for(int i=1;i<=M;i++) { for(int j=1;j<=T;j++) { if(j<w[i]) { dp[i][j]=dp[i-1][j]; } else { dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } } } //輸出 printf("%d",dp[M][T]); return 0; }