Problem:
Given $N (1 \le N \le 1000)$ items of value $v_i (1 \le v_i \le 1000)$ and some goal capacity $C (1 \le C \le 10000)$, find the minimum number of items needed to obtain a total value of $C$.
Input (file.in):
Line $1$: Two integers, $C$ and $N$.
Lines $2 \ldots N+1$: One integer, $v_i$.
Output (file.out):
Line $1$: The minimum number of items needed to obtain a total value of $C$.
Solution:
/* * Example Dynamic Programming Code * Albert Gural */ #include <fstream> using namespace std; FILE *fin = fopen("file.in", "r"); FILE *fout = fopen("file.out", "w"); int C, N; // C = capacity, N = number of items int dp[10005]; // dp[i] is min # of items for capacity i int val[1005]; // val[i] is value of ith item int main () { fscanf(fin, "%d %d", &C, &N); // Initialize val array from input for(int i = 0; i < N; i++) fscanf(fin, "%d", &val[i]); // Initialize dp array. (-1 is infinity) dp[0] = 0; for(int i = 1; i <= C; i++) dp[i] = -1; // Dynamic Programming bottom-up approach // For each capacity 1...C, for each item 1...N, // dp[i] is given by minimum of // including and not including item j. for(int i = 1; i <= C; i++) { for(int j = 0; j < N; j++) { if(val[j] <= i && dp[i - val[j]] != -1) { dp[i] = (dp[i] == -1)? (dp[i - val[j]] + 1) : (min(dp[i], dp[i - val[j]] + 1)); } } } // We want minimum # items for capacity C. fprintf(fout, "%d\n", dp[C]); return 0; }