蛮力法求解0-1背包问题

时间:2023-02-14 04:24:33
哪位高手能给一个蛮力法求解0-1背包问题的核心代码

7 个解决方案

#1


你先写出来一个测试程序,这样别人才好“填充”你要测试东西。否则你的问题太虚了。

#2


搜索、遍历、寻径、优化,这并不是什么难事,对于人工智能编程来说就相当于1+1=2一样是最基本的程序。

#3


引用 1 楼 sp1234 的回复:
你先写出来一个测试程序,这样别人才好“填充”你要测试东西。否则你的问题太虚了。

好吧,我的意思是这样的:假设我用数字1,2,3……n来表示物品,而用w[n]来表示第n个物品的重量,v[n]来表示第n个物品的价值,写一个算法来求解背包问题,假设背包最大承重为m。

#4


或者这是我找到的一段代码,就是解决0-1背包问题的,哪位高手能给分析一下这是怎么实现的吗?

#include <stdio.h>
#include <math.h>
#include <iostream.h>
#define MAX 100                      // 限定最多物品数

void conversion(int n,int b[MAX])
{
int i;
for(i=0;i<MAX;i++)
{
b[i] = n%2;
n = n/2;
if(n==0)break;
}
}

void main()
{
int i,j,n,b[MAX],temp[MAX];
float tw,maxv,w[MAX],v[MAX],temp_w,temp_v;
cout<<"输入物品个数:"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"请依次输入第"<<i+1<<"个物品的重量和价值"<<endl;
cin>>w[i];
cin>>v[i];
}
cout<<"输入背包的限制重量:";
cin>>tw;
maxv = 0;
/*穷举2n个可能的选择,找出物品的最佳选择*/
for (i=0;i<pow(2,n);i++)
{
       for (j=0;j<n;j++)
       {
              b[j] = 0;
       }
       conversion(i,b);
       temp_v = 0;
       temp_w = 0;
    for (j=0;j<n;j++)
       {
       if (b[j]==1)
       {
                 temp_w = temp_w+w[j];
                 temp_v = temp_v + v[j];
       }
       }
       if ((temp_w < tw)&&(temp_v>maxv))
       {
       for (j=0;j<n;j++)
       {
              temp[j] = 0;
       }
              maxv = temp_v;
for (j=0;j<n;j++)
{
   temp[j] = b[j];
}
       }
}
cout<<"输出放入背包的物品的最大价值:"<<maxv;
cout<<"选择的物品为:"<<endl;
for (j=0;j<n;j++)
{
if(temp[j])
cout<<j+1<<"\t";
}
}

#5


补充,上面的是C++代码,不是C#代码。

#6


你的程序写的很明白,就是穷举。一个物品要么放入背包,要么不放入背包,所有n个物品就可能有2^n个组合,然后它可能就去一个一个去判断每一个组合有没有超过背包的限制,在没有超过的所有组合中查找总价值最大的一个组合。

然而这个算法就实在是太土得掉渣了。如果你要的就是这个所谓“蛮力法”,我只能摇摇头。其实如果你什么都选择“最xxx”这种描述方式,就不是追求实用、带有启发规则的程序。实际上如果你写出一个简单的通用启发式规则的程序,最烂的情况下它也就是退化为所谓“蛮力”而已。但是如果你看了这类连个简单启发规则都不考虑的算法,你可能就根本对于改进程序的实用性没有思路了。

#7


引用 6 楼 sp1234 的回复:
你的程序写的很明白,就是穷举。一个物品要么放入背包,要么不放入背包,所有n个物品就可能有2^n个组合,然后它可能就去一个一个去判断每一个组合有没有超过背包的限制,在没有超过的所有组合中查找总价值最大的一个组合。

然而这个算法就实在是太土得掉渣了。如果你要的就是这个所谓“蛮力法”,我只能摇摇头。其实如果你什么都选择“最xxx”这种描述方式,就不是追求实用、带有启发规则的程序。实际上如果你写出一……

那有什么好些的算法呢,怎么写呢?

#1


你先写出来一个测试程序,这样别人才好“填充”你要测试东西。否则你的问题太虚了。

#2


搜索、遍历、寻径、优化,这并不是什么难事,对于人工智能编程来说就相当于1+1=2一样是最基本的程序。

#3


引用 1 楼 sp1234 的回复:
你先写出来一个测试程序,这样别人才好“填充”你要测试东西。否则你的问题太虚了。

好吧,我的意思是这样的:假设我用数字1,2,3……n来表示物品,而用w[n]来表示第n个物品的重量,v[n]来表示第n个物品的价值,写一个算法来求解背包问题,假设背包最大承重为m。

#4


或者这是我找到的一段代码,就是解决0-1背包问题的,哪位高手能给分析一下这是怎么实现的吗?

#include <stdio.h>
#include <math.h>
#include <iostream.h>
#define MAX 100                      // 限定最多物品数

void conversion(int n,int b[MAX])
{
int i;
for(i=0;i<MAX;i++)
{
b[i] = n%2;
n = n/2;
if(n==0)break;
}
}

void main()
{
int i,j,n,b[MAX],temp[MAX];
float tw,maxv,w[MAX],v[MAX],temp_w,temp_v;
cout<<"输入物品个数:"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"请依次输入第"<<i+1<<"个物品的重量和价值"<<endl;
cin>>w[i];
cin>>v[i];
}
cout<<"输入背包的限制重量:";
cin>>tw;
maxv = 0;
/*穷举2n个可能的选择,找出物品的最佳选择*/
for (i=0;i<pow(2,n);i++)
{
       for (j=0;j<n;j++)
       {
              b[j] = 0;
       }
       conversion(i,b);
       temp_v = 0;
       temp_w = 0;
    for (j=0;j<n;j++)
       {
       if (b[j]==1)
       {
                 temp_w = temp_w+w[j];
                 temp_v = temp_v + v[j];
       }
       }
       if ((temp_w < tw)&&(temp_v>maxv))
       {
       for (j=0;j<n;j++)
       {
              temp[j] = 0;
       }
              maxv = temp_v;
for (j=0;j<n;j++)
{
   temp[j] = b[j];
}
       }
}
cout<<"输出放入背包的物品的最大价值:"<<maxv;
cout<<"选择的物品为:"<<endl;
for (j=0;j<n;j++)
{
if(temp[j])
cout<<j+1<<"\t";
}
}

#5


补充,上面的是C++代码,不是C#代码。

#6


你的程序写的很明白,就是穷举。一个物品要么放入背包,要么不放入背包,所有n个物品就可能有2^n个组合,然后它可能就去一个一个去判断每一个组合有没有超过背包的限制,在没有超过的所有组合中查找总价值最大的一个组合。

然而这个算法就实在是太土得掉渣了。如果你要的就是这个所谓“蛮力法”,我只能摇摇头。其实如果你什么都选择“最xxx”这种描述方式,就不是追求实用、带有启发规则的程序。实际上如果你写出一个简单的通用启发式规则的程序,最烂的情况下它也就是退化为所谓“蛮力”而已。但是如果你看了这类连个简单启发规则都不考虑的算法,你可能就根本对于改进程序的实用性没有思路了。

#7


引用 6 楼 sp1234 的回复:
你的程序写的很明白,就是穷举。一个物品要么放入背包,要么不放入背包,所有n个物品就可能有2^n个组合,然后它可能就去一个一个去判断每一个组合有没有超过背包的限制,在没有超过的所有组合中查找总价值最大的一个组合。

然而这个算法就实在是太土得掉渣了。如果你要的就是这个所谓“蛮力法”,我只能摇摇头。其实如果你什么都选择“最xxx”这种描述方式,就不是追求实用、带有启发规则的程序。实际上如果你写出一……

那有什么好些的算法呢,怎么写呢?