C#算法.01背包问题.这个代码要怎么改?

MAX-sp 2014-01-27 03:54:35
 public class test
{

public static void Main()
{
int[] v = { 1, 2,3}; // 每件物品的价值
int[] w = { 1,2, 3}; // 每件物品的重量
Console.WriteLine("xxxxxmaximum value is: {0}", fetch(v, w, 5));
}

private static int fetch(int[] v, int[] w, int j) //初始时i=物品数量, j=背包总容量
{
int i = w.Count()-1;
return fetch(v, w, i, j);
}

static int fetch(int[] v, int[] w, int i, int j) //初始时i=物品数量, j=背包总容量
{
if (i == -1)
return 0;
if (j >= w[i])
{ // 背包剩余空间可以放下物品i
int v1 = fetch(v, w, i - 1, j - w[i]) + v[i]; //第i件物品放入所能得到的价值
int v2 = fetch(v, w, i - 1, j); //第i件物品不放所能得到的价值
if (v1 > v2 )
{
return v1;
}
else
{
return v2;
}
}
else
return fetch(v, w, i - 1, j);
}
}


有一个背包,背包容量是M=150。有7个 物品,物品不可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最 大,但不能超过总容量。
物品 A B C D E F G
大小 35 30 40 50 40 10 25
价值 10 40 30 50 35 40 30

上面的代码可以算到结果.但是不知道是要把哪几个物品放入背包.
求大神输出到底是哪几个物品放入背包了.感激不尽
...全文
329 点赞 收藏 15
写回复
15 条回复
angel6709 2015年10月27日
构建 w v 表,往回查找: 以最大容量10为例: name weight value 1 2 3 4 5 6 7 8 9 10 a 2 6 0 6 6 9 9 12 12 15 15 15 // 9----15 add a b 2 3 0 3 3 6 6 9 9 9 10 11 //6-----9 add b c 6 5 0 0 0 6 6 6 6 6 10 11 d 5 4 0 0 0 6 6 6 6 6 10 10 //0-----6 add e e 4 6 0 0 0 6 6 6 6 6 6 6
回复 点赞
angel6709 2015年10月27日

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    class Program
    { 
        class Item
        {
            public int index;
            public string name;
            public int weight;
            public int value;
        } 
        public static void Main()
        {
            List<Item> items = new List<Item>()
          {
              new Item{ index=1, name="a", value= 4, weight=4},
               new Item{ index=2, name="b", value= 4, weight=3},
                new Item{ index=3, name="c", value= 4, weight=6},
                 new Item{ index=4, name="d", value= 4, weight=9},
                  new Item{ index=5, name="e", value= 4, weight=1}
          };
            int maxWeight = 15;
            int[][] values = new int[items.Count + 1][];
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = new int[maxWeight + 1];
            }

            for (int i = 1; i <= items.Count; i++)
            {
                for (int j = 1; j <= maxWeight; j++)
                {

                    if (j >= items[i - 1].weight)
                    {
                        values[i][j] = Math.Max(values[i - 1][j - items[i - 1].weight] + items[i - 1].value, values[i - 1][j]);
                    }
                    else
                    {
                        values[i][j] = values[i - 1][j];
                    }

                }
            }

            int w = maxWeight;
            int len = items.Count;
            int lastValue = values[items.Count][maxWeight]; 

            List<Item> acceptedItems = new List<Item>();

            while (w > 0)
            {
                if (values[len][w] != lastValue)
                { 
                    while (len >= 0)
                    {
                        if (values[len][w + 1] != lastValue)
                        {
                            acceptedItems.Add(items[len]);
                            lastValue = values[len ][w + 1 - items[len].weight];
                            w = w + 1 - items[len].weight;
                            break;
                        }
                        else
                        {
                            len--;
                        }
                    }
                }
                else
                {
                    w--;
                }
            }

        }
    }
}


回复 点赞
隐语的影法師 2015年10月26日
而且,你的代码貌似也算不出正确答案,我用5个物品 重量为2,2,6,5,4价值为6,3,5,4,6背包容量为10 答案应该是15,但是你这代码算出的是11.
回复 点赞
隐语的影法師 2015年10月26日
最恶心的是你贴出来的代码爆慢!我最不能忍受速度慢的代码
回复 点赞
隐语的影法師 2015年10月26日
额,兄弟,背包问题是最典型的动态规划问题啊,为啥用递归算法?优雅并消耗大量内存的递归算法 不是我所追求的。。
回复 点赞
wangderong83899 2014年03月25日
引用 4 楼 sp1234 的回复:
有的人学习的目的是为了让自己真的懂,有的人学习的目的是为了让别人以为自己可能懂。 前者往往比较直率,后者比较奸诈。呵呵。
请问你知道答案么?
回复 点赞
wangderong83899 2014年03月25日
顶起啊,我也需要答案,不知道楼主搞定没
回复 点赞
秋风破浪 2014年03月25日
引用 9 楼 wangderong83899 的回复:
[quote=引用 4 楼 sp1234 的回复:] 有的人学习的目的是为了让自己真的懂,有的人学习的目的是为了让别人以为自己可能懂。 前者往往比较直率,后者比较奸诈。呵呵。
请问你知道答案么?[/quote] 我算的是23567 对么
回复 点赞
MAX-sp 2014年02月17日
算法大神
回复 点赞
MAX-sp 2014年02月07日
算法大神求进.
回复 点赞
MAX-sp 2014年01月30日
引用 4 楼 sp1234 的回复:
有的人学习的目的是为了让自己真的懂,有的人学习的目的是为了让别人以为自己可能懂。 前者往往比较直率,后者比较奸诈。呵呵。
彼此彼此
回复 点赞
以专业开发人员为伍 2014年01月27日
有的人学习的目的是为了让自己真的懂,有的人学习的目的是为了让别人以为自己可能懂。 前者往往比较直率,后者比较奸诈。呵呵。
回复 点赞
MAX-sp 2014年01月27日
1楼不是答案啊.我晕
回复 点赞
MAX-sp 2014年01月27日
引用 1 楼 liuchaolin 的回复:
int[] v = {10, 40, 30 ,50, 35 ,40 ,30}; // 每件物品的价值 int[] w = { 35, 30, 40 ,50 ,40, 10 ,25 }; // 每件物品的重量 Console.WriteLine("xxxxxmaximum value is: {0}", fetch(v, w, 150)); 自己带进去不就完了吗?
上面的代码可以算到结果.但是不知道是要把哪几个物品放入背包. 求大神输出到底是哪几个物品放入背包了
回复 点赞
md5e 2014年01月27日
int[] v = {10, 40, 30 ,50, 35 ,40 ,30}; // 每件物品的价值 int[] w = { 35, 30, 40 ,50 ,40, 10 ,25 }; // 每件物品的重量 Console.WriteLine("xxxxxmaximum value is: {0}", fetch(v, w, 150)); 自己带进去不就完了吗?
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告