AOJ1092 Make KND So Fat
問題リンク Make KND So Fat
- 解法
DPです。
buy[甘味セット][使える金額] -> 体重への影響の最大値
という表を前処理で作ったのち、
dp[何日目][使える金額] -> 体重への影響の最大値
という表を埋めればOKです。
- ソース
import java.util.Scanner; //Make KND So Fat public class AOJ1092 { void run(){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int S = sc.nextInt(), D = sc.nextInt(), M = sc.nextInt(); int[][] buy = new int[S][M+1]; for(int i=0;i<S;i++){ int k = sc.nextInt(); int[] w = new int[k], p = new int[k]; for(int j=0;j<k;j++){ w[j] = sc.nextInt(); p[j] = sc.nextInt(); } int[][] dp = new int[k][M+1]; for(int u=0;u<k;u++)for(int j=0;j<=M;j++){ if(u>0)dp[u][j] = dp[u-1][j]; if(p[u]<=j)dp[u][j] = Math.max(dp[u][j], w[u] + (u>0?dp[u-1][j-p[u]]:0)); } for(int j=0;j<=M;j++)buy[i][j] = dp[k-1][j]; } int[] f = new int[D+1]; for(int i=0;i<D;i++)f[i]=sc.nextInt(); int[][] dp = new int[D][M+1]; for(int i=0;i<D;i++)for(int j=0;j<=M;j++){ if(i>0)dp[i][j] = dp[i-1][j]; int s = f[i]; for(int u=0;u<=j;u++)dp[i][j] = Math.max(dp[i][j], buy[s][u] + (i>0?dp[i-1][j-u]:0)); } int res = -1, m = -1; for(int i=0;i<=M;i++)if(res<dp[D-1][i]){ res = dp[D-1][i]; m = i; } System.out.println(res+" "+m); } } public static void main(String[] args) { new AOJ1092().run(); } }