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; } } }
注意每个物品只能取一次,所以剩余空间的最优价值存储在上一行,本行可能包含了当前物品,这会导致同一物品取2次,另外剩余物品最优价值的列是[j-weight[i]-1]
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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语句慢的原因