背包问题。求详细的解释。代码已经写好了。

奥数题 2008-12-11 03:02:35
下面是模仿JAVA的背包算法,但是小弟不才,不知道他为什么这样写。

//定义物品的种类
static int Num = 5;//物品的种类

//初始数据
private List<Fruit> GetList()
{
List<Fruit> list = new List<Fruit> ();
string[ , ] Data = this.LoadData();
for ( int i = 0 ; i < Num ; i++ )
{
Fruit model = new Fruit();
model.Code =int.Parse( Data[ i , 0 ].ToString());
model.Name = Data[ 1 , 1 ].ToString();
model.Weight = int.Parse( Data[ i , 2 ].ToString() );
model.Price = float.Parse(Data[i,3].ToString());
list.Add( model );

}
return list;

}

private string[ , ] LoadData()
{
string [,] Data= new string [Num,4];
Data[ 0 ,0 ] = "0";
Data[ 0 , 1 ] = "A";
Data[ 0 , 2 ] = "4";
Data[ 0 , 3 ] = "4500";

Data[ 1 , 0 ] = "1";
Data[ 1 , 1 ] = "B";
Data[ 1 , 2 ] = "5";
Data[ 1 , 3 ] = "5700";


Data[ 2 , 0 ] = "2";
Data[ 2 , 1 ] = "C";
Data[ 2 , 2 ] = "2";
Data[ 2 , 3 ] = "2250";

Data[ 3 , 0 ] = "3";
Data[ 3 , 1 ] = "D";
Data[ 3 , 2 ] = "1";
Data[ 3 , 3 ] = "1100";


Data[ 4 , 0 ] = "4";
Data[ 4 , 1 ] = "E";
Data[ 4 , 2 ] = "6";
Data[ 4 , 3 ] = "6700";
return Data;

}
//背包算法
private int[] GetKnapsack( List<Fruit> list )
{
int max= int .Parse (txtMax.Text);//最大重量
int[] value = new int[ max+1 ];
int[] item = new int[ max+1 ];
//
for ( int i = 0 ; i < Num ; i++ )
{
for ( int j = list[ i ].Weight ; j < max+1 ; j++ )
{
int p = j - list[ i ].Weight;
int newValue =(int) list[ i ].Price + value[p];
if ( newValue > value[ j ] )
{
value[ j ] = newValue;
item[ j ] = i;
}
}
}
return value;
}


///=============================
for ( int j = list[ i ].Weight ; j < max+1 ; j++ )
{
int p = j - list[ i ].Weight;
int newValue =(int) list[ i ].Price + value[p];
if ( newValue > value[ j ] )
{
value[ j ] = newValue;
item[ j ] = i;
}
}
///=============================
这段,为什么是这样子写,就可以找出最佳结果。
...全文
133 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kw5004374 2011-06-13
  • 打赏
  • 举报
回复
学习学习
wartim 2008-12-17
  • 打赏
  • 举报
回复
假设max=2000公斤 就是说背包容量是2000公斤
for ( int i = 0 ; i < Num ; i++ ) //每件东西都去试试
{
// 试第i个东西
for ( int j = list[ i ].Weight ; j < max+1 ; j++ ) // 算每个重量单位差额的权值,试到超过最大重量
{
int p = j - list[ i ].Weight; // 假设 list[ i ].Weight=500 而且现在循环到j=501公斤
int newValue =(int) list[ i ].Price + value[p]; // 新的差1公斤时的权值=这个东西的价钱+老的差1公斤时的权值
if ( newValue > value[ j ] ) 如果新的权值更大
{
value[ j ] = newValue; 就用新的替换
item[ j ] = i; 而且如果差1公斤,优先取第i个物品
}
}
}
最后应该是 return item;

java的这里
for(int i = MAX; i >= MIN; i = i - fruits[item[i]].getSize())
// 比如i = i - fruits[item[i]].getSize()减出来还可以装1公斤,那就优先拿上面刚算出来的第i个物品,主要,此i非彼i
{
System.out.println(fruits[item[i]].getName()+ "\t" + fruits[item[i]].getPrice());

这是我的理解
大概是这样吧,也说不太清楚,反正就是在容量有限的情况下,尽可能的装更多的东西,而且装的东西总价值最高

奥数题 2008-12-17
  • 打赏
  • 举报
回复
哎,大家都是来学习的嘛
gxlqssjf 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tian_fang 的回复:]
学习
[/Quote]
学习了,不过还是不懂
dayizhixiaotutu 2008-12-12
  • 打赏
  • 举报
回复
学习
tian_fang 2008-12-12
  • 打赏
  • 举报
回复
学习
奥数题 2008-12-12
  • 打赏
  • 举报
回复
自己来一个吧
cyqlightrain 2008-12-11
  • 打赏
  • 举报
回复
看不懂!!

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧