/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// your code goes here
int[][]items = {{2,4},{3,2},{4,1},{6,4},{12,4}};
int budget = 8;
int maxVal = 0;
int n = items.length;
HashMap
<Integer, Integer
> map
= new HashMap
<>(); for(int[] i : items){
maxVal
= Math.
max(maxVal, i
[0]); map.put(i[0], map.getOrDefault(i[0], 0) + 1);
}
int[] gain = new int[n];
for(int i = 0; i < n; i++){
int num = items[i][0];
int count = 0;
for(int j = num; j <= maxVal; j += num){
count += map.getOrDefault(j, 0);
}
gain[i] = count - 1;
}
int[][][] dp = new int[n + 1][budget + 1][2];
for(int j = 0; j <= budget; j++){
if(items[0][1] <= j){
int price = items[0][1];
if(j - price >= 0){
dp
[0][j
][1] = Math.
max(1 + dp
[0][j
- price
][0] + gain
[0],
1 + dp
[0][j
- price
][1]); }
}
}
for(int i = 1; i < n; i++){
for(int j = 0; j <= budget; j++){
int price = items[i][1];
dp
[i
][j
][0] = Math.
max(dp
[i
-1][j
][0], dp
[i
- 1][j
][1]);
int w1 = 0;
if(j - price >= 0){
w1 = 1 + gain[i] + dp[i][j - price][0];
}
int w2 = 0;
if(j - price >= 0){
w2 = 1 + dp[i][j - price][1];
}
dp
[i
][j
][1] = Math.
max(w1, w2
); }
}
int ans
= Math.
max(dp
[n
- 1][budget
][0], dp
[n
- 1][budget
][1]); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQkKCQlpbnRbXVtdaXRlbXMgPSB7ezIsNH0sezMsMn0sezQsMX0sezYsNH0sezEyLDR9fTsKCQlpbnQgYnVkZ2V0ID0gODsKCQkKCQlpbnQgbWF4VmFsID0gMDsKICAgICAgICBpbnQgbiA9IGl0ZW1zLmxlbmd0aDsKICAgICAgICBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBmb3IoaW50W10gaSA6IGl0ZW1zKXsKICAgICAgICAgICAgbWF4VmFsID0gTWF0aC5tYXgobWF4VmFsLCBpWzBdKTsKICAgICAgICAgICAgbWFwLnB1dChpWzBdLCBtYXAuZ2V0T3JEZWZhdWx0KGlbMF0sIDApICsgMSk7CiAgICAgICAgfQoKICAgICAgICBpbnRbXSBnYWluID0gbmV3IGludFtuXTsKCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgICAgIGludCBudW0gPSBpdGVtc1tpXVswXTsKICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgICAgZm9yKGludCBqID0gbnVtOyBqIDw9IG1heFZhbDsgaiArPSBudW0pewogICAgICAgICAgICAgICAgY291bnQgKz0gbWFwLmdldE9yRGVmYXVsdChqLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnYWluW2ldID0gY291bnQgLSAxOwogICAgICAgIH0KCiAgICAgICAgaW50W11bXVtdIGRwID0gbmV3IGludFtuICsgMV1bYnVkZ2V0ICsgMV1bMl07CgoKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDw9IGJ1ZGdldDsgaisrKXsKICAgICAgICAgICAgICAgIGlmKGl0ZW1zWzBdWzFdIDw9IGopewogICAgICAgICAgICAgICAgICAgIGludCBwcmljZSA9IGl0ZW1zWzBdWzFdOwogICAgICAgICAgICAgICAgICAgIGlmKGogLSBwcmljZSA+PSAwKXsKICAgICAgICAgICAgICAgICAgICBkcFswXVtqXVsxXSA9IE1hdGgubWF4KDEgKyBkcFswXVtqIC0gcHJpY2VdWzBdICsgZ2FpblswXSwgMSArIGRwWzBdW2ogLSBwcmljZV1bMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBuOyBpKyspewogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDw9IGJ1ZGdldDsgaisrKXsKICAgICAgICAgICAgICAgIGludCBwcmljZSA9IGl0ZW1zW2ldWzFdOyAKICAgICAgICAgICAgICAgIGRwW2ldW2pdWzBdID0gTWF0aC5tYXgoZHBbaS0xXVtqXVswXSwgZHBbaSAtIDFdW2pdWzFdKTsKCiAgICAgICAgICAgICAgICBpbnQgdzEgPSAwOwogICAgICAgICAgICAgICAgaWYoaiAtIHByaWNlID49IDApewogICAgICAgICAgICAgICAgICAgIHcxID0gMSArIGdhaW5baV0gKyBkcFtpXVtqIC0gcHJpY2VdWzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGludCB3MiA9IDA7CiAgICAgICAgICAgICAgICBpZihqIC0gcHJpY2UgPj0gMCl7CiAgICAgICAgICAgICAgICAgICAgdzIgPSAxICsgZHBbaV1baiAtIHByaWNlXVsxXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkcFtpXVtqXVsxXSA9IE1hdGgubWF4KHcxLCB3Mik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgaW50IGFucyA9IE1hdGgubWF4KGRwW24gLSAxXVtidWRnZXRdWzBdLCBkcFtuIC0gMV1bYnVkZ2V0XVsxXSk7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KGFucyk7Cgl9Cn0=