說我有一個揹包,有n個格子,一個格子能夠放5個鑽石,一個鑽石10塊錢,一個格子能夠放5個ruby,一個ruby 5塊錢, 一個格子能夠放一個裝備,一個裝備25塊錢。
而後給你n個鑽石n個ruby n個裝備,求最大化收益。
相似Ones and Zeroesjava
Dp[i][j][k] = Max(dp[i-5][j][k] + 5*10, dp[i][j-5][k] + 5*5, dp[i][j][k-1] + 1*25)ruby
reduce了dimension,其實還有一個維度是前k個格子,直接用倒序省掉了這個維度spa
1 package pg; 2 3 import java.util.*; 4 5 public class Ruby { 6 7 public static int maxProfit(int n, int a, int b, int c) { 8 int[][][] dp = new int[a+1][b+1][c+1]; 9 for (int l=1; l<=n; l++) { 10 for (int i=a; i>=0; i--) { 11 for (int j=b; j>=0; j--) { 12 for (int k=c; k>=0; k--) { 13 if (i >= 5) dp[i][j][k] = Math.max(dp[i][j][k], dp[i-5][j][k] + 5*10); 14 if (j >= 5) dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j-5][k] + 5*5); 15 if (k >= 1) dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j][k-1] + 1*25); 16 } 17 } 18 } 19 } 20 return dp[a][b][c]; 21 } 22 23 24 /** 25 * @param args 26 */ 27 public static void main(String[] args) { 28 // TODO Auto-generated method stub 29 int res = maxProfit(3, 10, 15, 3); 30 System.out.println(res); 31 } 32 33 }