How to count the combinations not greater than a given volume in a knapsack problem?
-
05-11-2019 - |
题
You are given a certain set of items with weight wi and the volume of the bag.
Case:
Input:
3 (count of items) 10 (volume of the bag)
1 2 4 (weight for each item)
Output
8 (since you can put any item in or not 2 * 2 *2)
I have a naive solution using DFS as
public class Main {
public static void main(String... args) throws Exception {
Scanner scanner = new Scanner(System.in);
int size = scanner.nextInt();
int volume = scanner.nextInt();
int[] weights = new int[size];
for (int i = 0; i < size; ++i) weights[i] = scanner.nextInt();
System.out.println(getCounts(weights, 0, volume));
}
private static int getCounts(int[] nums, int pos, int target) {
if (target < 0) return 0;
if (pos >= nums.length) return 1;
return getCounts(nums, pos+1, target) +
getCounts(nums, pos+1, target-nums[pos]);
}
}
As expected, it produced TLE
and I added cache to avoid re-calculation as
public class Main {
private static int[][] cache;
public static void main(String... args) throws Exception {
Scanner scanner = new Scanner(System.in);
int size = scanner.nextInt();
int volume = scanner.nextInt();
cache = new int[size+1][volume+1];
for (int i = 0; i <= size; ++i) {
for (int j = 0; j <= volume; ++j) {
cache[i][j] = -1;
}
}
int[] weights = new int[size];
for (int i = 0; i < size; ++i) weights[i] = scanner.nextInt();
System.out.println(getCounts(weights, 0, volume));
}
private static int getCounts(int[] nums, int pos, int target) {
if (target < 0) return 0;
if (pos == nums.length) return 1;
if (cache[pos][target] != -1) return cache[pos][target];
int count = getCounts(nums, pos+1, target) +
getCounts(nums, pos+1, target-nums[pos]);
cache[pos][target] = count;
return count;
}
}
But the OJ prompt me of memory error while the memory is within the limit => 13064K < 32768K, any idea to solve this issue?
- Why did it fail?
- Could a DP solution without backtracking be found for this?
Any help will be appreciated :)
Here is the original problem in Chinese.
没有正确的解决方案
不隶属于 cs.stackexchange