C# 动态规划:改进的背包

C# 动态规划:改进的背包,c#,floating,knapsack-problem,C#,Floating,Knapsack Problem,我尝试使用动态规划解决背包问题的一个变体: 所以我有一个正方形的区域,尺寸为:N*N(就像棋盘一样)。在每个正方形上我都有一些值。我能做的是在正方形上的值上加一(+1)或去掉一(-1)。有一条特殊的规则说,如果有相邻的正方形(有公共边的正方形-对角线正方形不计算)的值等于正方形的新值,那么所有这些相邻正方形的值都设置为零 目标是尽可能减少所有正方形的总值 例如,如果我有一个矩阵3x3,表示一个有3*3个正方形的场,那么我们可以得到如下结果: int[3,3] field = { 1, 2, 3,

我尝试使用动态规划解决背包问题的一个变体:

所以我有一个正方形的区域,尺寸为:N*N(就像棋盘一样)。在每个正方形上我都有一些值。我能做的是在正方形上的值上加一(+1)或去掉一(-1)。有一条特殊的规则说,如果有相邻的正方形(有公共边的正方形-对角线正方形不计算)的值等于正方形的新值,那么所有这些相邻正方形的值都设置为零

目标是尽可能减少所有正方形的总值

例如,如果我有一个矩阵3x3,表示一个有3*3个正方形的场,那么我们可以得到如下结果:

int[3,3] field = { 1, 2, 3, 5, 1, 6, 7, 3, 9 } 我用另一种方法调用背包算法:

List<Item> actionsToDo = new List<Item>();
Item newItemTake;
Item newItemAdd;

for (int depth = 0; depth < maxDepth; depth++)
    {
    for (int row = 0; row < dimension; row++)
    {
        for (int col = 0; col < dimension; col++)
        {
            if (ratings[Take, depth, row, col] >= 0)
            {
                newItemTake = new Item(row, col, Take, depth + 1, ratings[Take, depth, row, col]);
                actionsToDo.Add(newItemTake);
            }
            if (ratings[Add, depth, row, col] >= 0)
            {
                newItemAdd = new Item(row, col, Add, depth + 1, ratings[Add, depth, row, col]);
                actionsToDo.Add(newItemAdd);
            }
        }
    }
}

int totalRating = 0;

List<Item> itemsToBePacked = KnapSackProblem.FindItemsToPack(actionsToDo, maxDepth, out totalRating);

foreach (var item in itemsToBePacked)
{
    Console.WriteLine(item);
}
Console.WriteLine(totalRating);
List actionsToDo=new List();
项目newItemTake;
项目newItemAdd;
对于(int-depth=0;depth=0)
{
newItemTake=新项目(行、列、列、深度+1,评级[行、深度、行、列]);
actionsToDo.Add(newItemTake);
}
if(评级[添加、深度、行、列]>=0)
{
newItemAdd=新项目(行,列,添加,深度+1,评级[添加,深度,行,列]);
actionsToDo.Add(newItemAdd);
}
}
}
}
int totalRating=0;
List itemstobepacket=背包问题。findItemStopPack(actionsToDo、maxDepth、OutTotalRating);
foreach(itemsToBePacked中的var项目)
{
控制台写入线(项目);
}
控制台写入线(总额定值);

第一步:编辑您的帖子并仅将引用代码的部分格式化为“代码”(ctrl-k将格式化为代码)。就目前的情况来看,阅读起来非常困难。其次,修改你的问题,使它读起来不像一篇论文。把它提炼成基本问题。@Michael,这不是解决问题的方法。如果你打算留下这样的评论,那么你可以编辑这个问题。如果你想让他删掉一些东西,那么你应该提供第二次编辑来删除这些东西(我认为,合并编辑有两分钟的时间,这应该足以解决一些问题并花时间进行编辑)。记住,咆哮是容易的,帮助是困难的。你是来帮忙的,不是来讨好的。如果你忘记了,也许禁令会鼓励你表现得好一些?Simeon,要确定这一点被打破的原因是相当棘手的,你能更具体地强调一下你需要什么帮助吗?此外,我要指出的是,您的角(考虑到中间的
1
)看起来是最有可能失去空间的地方,如果您没有低于零,中间底部的
3
将最大限度地限制这些值。否则,你可以使用边角使边角低于零,然后使用中间使边角回到正数,我认为。
List<Item> actionsToDo = new List<Item>();
Item newItemTake;
Item newItemAdd;

for (int depth = 0; depth < maxDepth; depth++)
    {
    for (int row = 0; row < dimension; row++)
    {
        for (int col = 0; col < dimension; col++)
        {
            if (ratings[Take, depth, row, col] >= 0)
            {
                newItemTake = new Item(row, col, Take, depth + 1, ratings[Take, depth, row, col]);
                actionsToDo.Add(newItemTake);
            }
            if (ratings[Add, depth, row, col] >= 0)
            {
                newItemAdd = new Item(row, col, Add, depth + 1, ratings[Add, depth, row, col]);
                actionsToDo.Add(newItemAdd);
            }
        }
    }
}

int totalRating = 0;

List<Item> itemsToBePacked = KnapSackProblem.FindItemsToPack(actionsToDo, maxDepth, out totalRating);

foreach (var item in itemsToBePacked)
{
    Console.WriteLine(item);
}
Console.WriteLine(totalRating);