2. 0-1 背包問題

# 題目給的 w(i) 一定是從 1 開始,故實做 dp 時,取 weights, values 都要 -1

Console.Write("  輸入物品的總數量: ");
int n = int.Parse(Console.ReadLine());

Console.Write("  輸入背包的最大承載量 (10 的倍數): ");
int W = int.Parse(Console.ReadLine()) / 10;

Console.WriteLine("輸入各物品的重量與價值:");

int[] weights = new int[n];
int[] values = new int[n];
for (int i = 1; i <= n; i++)
{
    Console.Write($"物品 {i} - 重量: ");
    weights[i - 1] = int.Parse(Console.ReadLine()) / 10;
    Console.Write($"物品 {i} - 價值: ");
    values[i - 1] = int.Parse(Console.ReadLine());
}

int[,] c = new int[n + 1, W + 1];

for (int i = 0; i <= n; i++)
{
    for (int w = 0; w <= W; w++)
    {
        if (i == 0 || w == 0) continue; // defaults to 0, we just have to continue.
        if (weights[i - 1] > w)
            c[i, w] = c[i - 1, w];
        if (i > 0 && w >= weights[i - 1]) c[i, w] = Math.Max(values[i - 1] + c[i - 1, w - weights[i - 1]], c[i - 1, w]);
    }
}

for (int i = 0; i <= n; i++)
{
    for (int w = 0; w <= W; w++)
    {
        Console.Write($"{c[i, w]}\t");
    }
    Console.WriteLine();
}

Last updated