0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

プログラミングコンテストチャレンジブック p58 個数制限なしナップサック問題(C#)

Posted at

問題

重さと価値がそれぞれ、wi,viであるようなn個の品物があります。これらの品物から、重さの総和がWを超えないように選んだときの、価値の総和の最大値を求めなさい。ただし、同じ種類の品物をいくつでも選ぶことができます。

全探索

自分(正解)

using System;

public class Program
{
    public static void Main()
    {
        int n = 3;
        int W = 7;
        int[,] list = new int[,] { { 3, 4 }, { 4, 5 }, { 2, 3 } };
        int ans;

        //個数制限なしの解答
        //indexをMax(入れてそのまま, 入れずに次へ)にする
        //同じ品物を入れ続けた際の終了(次のindexに行く)条件は、weight - list[index,0]が0を下回ること。次の品物なら入る可能性があるが、少なくとも同じ品物ではこれ以上入れることができないので。



        ans = exec(0, W);
        Console.WriteLine("答えは、{0}", ans);

        int exec(int index, int weight)//index番目以降を使って、残り入る重さはWだけある
        {
            if (index == n) return 0;
            if (weight - list[index, 0] < 0)
            {
                return exec(index + 1, weight);
            }
            else
            {
                return Math.Max(exec(index, weight - list[index, 0]) + list[index, 1], exec(index + 1, weight));
            }
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?