📖 Scenario: You are helping a shop owner who wants to fill a knapsack with items to maximize value. The knapsack can hold a limited weight, but the owner can use unlimited quantities of each item.Each item has a weight and a value. Your task is to find the maximum value that fits in the knapsack.
🎯 Goal: Build a program that calculates the maximum total value for the unbounded knapsack problem using dynamic programming.
📋 What You'll Learn
Create arrays for item weights and values
Create an integer variable for knapsack capacity
Use a dynamic programming array to store maximum values for each capacity
Implement the unbounded knapsack logic using loops
Print the maximum value that fits in the knapsack
💡 Why This Matters
🌍 Real World
This problem models situations like packing goods with unlimited supply to maximize profit or resource allocation with repeatable tasks.
💼 Career
Understanding dynamic programming and knapsack problems is important for software engineers working on optimization, resource management, and algorithm design.
Progress0 / 4 steps
1
Create item weights and values arrays
Create an integer array called weights with values 2, 3, 4, 5 and an integer array called values with values 3, 4, 5, 6.
DSA C#
Hint
Use array initialization syntax with curly braces and exact values.
2
Set knapsack capacity
Create an integer variable called capacity and set it to 8.
DSA C#
Hint
Use a simple integer variable assignment.
3
Implement unbounded knapsack logic
Create an integer array called dp of size capacity + 1 initialized with zeros. Use a for loop with variable w from 1 to capacity. Inside it, use a for loop with variable i from 0 to weights.Length - 1. If weights[i] <= w, update dp[w] to the maximum of dp[w] and dp[w - weights[i]] + values[i].
DSA C#
Hint
Use nested loops and update dp array with maximum values.
4
Print the maximum value
Print the value of dp[capacity] using Console.WriteLine.
DSA C#
Hint
Use Console.WriteLine to print the final dp value at capacity index.
Practice
(1/5)
1. What is the main difference between the Unbounded Knapsack Problem and the 0/1 Knapsack Problem?
easy
A. In Unbounded Knapsack, you can use unlimited copies of each item.
B. In Unbounded Knapsack, items cannot be repeated.
C. Unbounded Knapsack only works with fractional items.
D. Unbounded Knapsack has a fixed number of items to choose from.
Solution
Step 1: Understand item usage rules
In 0/1 Knapsack, each item can be chosen at most once. In Unbounded Knapsack, items can be chosen unlimited times.
Step 2: Compare problem constraints
Unbounded Knapsack allows multiple copies of the same item, unlike 0/1 Knapsack.
Final Answer:
In Unbounded Knapsack, you can use unlimited copies of each item. -> Option A
Quick Check:
Unlimited item usage = In Unbounded Knapsack, you can use unlimited copies of each item. [OK]
Hint: Remember: Unbounded means unlimited item copies allowed [OK]
Common Mistakes:
Confusing Unbounded with fractional knapsack
Thinking items can only be chosen once
Assuming fixed number of items to pick
2. Which of the following C# code snippets correctly initializes the DP array for the Unbounded Knapsack problem of capacity W?
easy
A. int[] dp = new int[W + 1]; for (int i = 0; i <= W; i++) dp[i] = 0;
B. int[] dp = new int[W]; for (int i = 0; i < W; i++) dp[i] = -1;
C. int[] dp = new int[W + 1]; for (int i = 1; i <= W; i++) dp[i] = int.MaxValue;
D. int[] dp = new int[W + 1]; for (int i = 0; i <= W; i++) dp[i] = int.MinValue;
Solution
Step 1: Check array size and initialization
The DP array size should be W+1 to cover capacities from 0 to W. Initializing with 0 is correct for max value problems.
Step 2: Validate initialization values
Setting dp[i] = 0 means no value at start, which is correct. Negative or max int values are incorrect here.
Final Answer:
int[] dp = new int[W + 1]; for (int i = 0; i <= W; i++) dp[i] = 0; -> Option A
Quick Check:
DP array size W+1 and zero initialization = int[] dp = new int[W + 1]; for (int i = 0; i <= W; i++) dp[i] = 0; [OK]
Hint: DP array size = capacity + 1, initialize with zero for max value [OK]
Common Mistakes:
Using wrong array size (W instead of W+1)
Initializing with int.MaxValue or int.MinValue incorrectly
Starting loop from 1 instead of 0
3. What is the output of the following C# code snippet for Unbounded Knapsack?
int W = 5;
int[] wt = {1, 3, 4};
int[] val = {10, 40, 50};
int[] dp = new int[W + 1];
for (int i = 0; i <= W; i++) {
for (int j = 0; j < wt.Length; j++) {
if (wt[j] <= i) {
dp[i] = Math.Max(dp[i], dp[i - wt[j]] + val[j]);
}
}
}
Console.WriteLine(dp[W]);
Check if multiple items can be combined:
- For dp[5], try dp[5-1]+10=dp[4]+10=50+10=60
- For dp[4], dp[4-4]+50=dp[0]+50=50
- For dp[3], dp[3-3]+40=dp[0]+40=40
- For dp[2], dp[2-1]+10=dp[1]+10=10+10=20
- For dp[1], dp[1-1]+10=dp[0]+10=10
So dp[5] = 60
Final Answer:
60 -> Option C
Quick Check:
Maximum value for capacity 5 = 60 [OK]
Hint: Trace dp array from 0 to W, update max values [OK]
Common Mistakes:
Not considering multiple copies of items
Incorrect dp array indexing
Mixing up weights and values
4. Identify the bug in this Unbounded Knapsack C# code snippet:
int W = 7;
int[] wt = {1, 3, 4};
int[] val = {10, 40, 50};
int[] dp = new int[W + 1];
for (int i = 0; i < W; i++) {
for (int j = 0; j < wt.Length; j++) {
if (wt[j] <= i) {
dp[i] = Math.Max(dp[i], dp[i - wt[j]] + val[j]);
}
}
}
Console.WriteLine(dp[W]);
medium
A. The inner loop should run from 1 to wt.Length.
B. The condition should be wt[j] < i instead of wt[j] <= i.
C. The dp array size should be W instead of W + 1.
D. The outer loop should run from 0 to W inclusive (i <= W).
Solution
Step 1: Check loop ranges for dp array access
The dp array has size W+1, so valid indices are 0 to W inclusive. The outer loop runs only to i < W, missing dp[W].
Step 2: Identify impact of loop range
Because dp[W] is not computed, the final answer dp[W] will be incorrect or default zero.
Final Answer:
The outer loop should run from 0 to W inclusive (i <= W). -> Option D
Quick Check:
Loop must cover full dp array size = The outer loop should run from 0 to W inclusive (i <= W). [OK]
Hint: Loop dp array fully from 0 to W inclusive [OK]
Common Mistakes:
Using wrong loop bounds causing incomplete dp calculation
Incorrect dp array size
Wrong comparison operators in conditions
5. Given items with weights [2, 3, 5] and values [50, 70, 100], and a knapsack capacity of 8, what is the maximum value achievable using the Unbounded Knapsack approach?
hard
A. 270
B. 200
C. 250
D. 220
Solution
Step 1: Calculate dp array values for capacities 0 to 8
Try combining items differently:
- Using four 2-weight items: 4*50=200
- Using two 3-weight + one 2-weight: 2*70+50=190
- Using one 5-weight + one 3-weight: 100+70=170
- Using one 5-weight + one 3-weight + one 2-weight (over capacity)
No better than 200 found, but check dp[8] carefully:
- dp[8] = max(200, 190, 170) = 200