遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

0-1背包问题

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i < 40; i++)
            {
               (new MaxBag()).main(null);
                Console.WriteLine("----------------------------------------");
            }
            Console.Read();
        }
    }
    public class MaxBag
    {
         int n;           // 描述物品个数
         int c;           // 描述背包容量
         int[] value;     // 描述物品价值
        int[] weight;    // 描述物品重量

        public  void main(String[] args) {
        // 初始赋值操作
        value = new int[]{1500, 3000, 2000,2000};
        weight = new int[]{1, 4, 3,1};

        var rnd = new Random(Environment.TickCount);
        var index=rnd.Next(0, 3);
        var temp = value[0];
        value[0] = value[index];
        value[index] = temp;
        temp = weight[0];
        weight[0] = weight[index];
        weight[index] = temp;

        c =5;
        n = value.Length;

        // 构造最优解的网格:3行4列
        int[][] maxValue = new int[n][];
        for (int i = 0; i < n; i++)
        {
            maxValue[i] = new int[c];
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < c; j++) {
                maxValue[i][j] = 0;
            }
        }   // end for

        // 填充网格
        for (int i = 0; i < n; i++) {
            for (int j = 1; j <= c; j++) {
                if (i == 0) {
                    maxValue[i][j - 1] = (weight[i] <= j ? value[i] : 0);
                } else {
                    int topValue = maxValue[i - 1][j - 1];  // 上一个网格的值
                    int thisValue = (weight[i] <= j ?       // 当前商品的价值 + 剩余空间的价值
                            (j - weight[i] > 0 ? value[i] + maxValue[i - 1][j - weight[i]-1] : value[i])
                            : topValue);

                    // 返回 topValue和thisValue中较大的一个
                    maxValue[i][j - 1] = (topValue > thisValue ? topValue : thisValue);
                }   // end if
            }   // end inner for
        }   // end outer for

        // 打印结果二维数组maxValue
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < c; j++) {
                Console.Write( P(maxValue[i][j]) + "    ");
            }
            Console.WriteLine();
        }
    }

        private String P(int v)
        {
            var strV = v.ToString();
            var len = strV.Length;
             strV = ("          " + strV);
             strV=strV.Substring(strV.Length-5);
             return strV;
        }

    }
    
}
View Code
复制代码

注意每个物品只能取一次,所以剩余空间的最优价值存储在上一行,本行可能包含了当前物品,这会导致同一物品取2次,另外剩余物品最优价值的列是[j-weight[i]-1]

参考

https://www.jianshu.com/p/a66d5ce49df5

posted on   遗忘海岸  阅读(212)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2011-05-11 纠结的Session备忘
2009-05-11 一个查选优化的例子,转--SQL Server中存储过程比直接运行SQL语句慢的原因
点击右上角即可分享
微信分享提示