對于背包問題(這個是背包問題,不是0/1背包問題)貪心算法 背包問題 c,貪心有三種策略:
2、從物品中選區(qū)重量最小的放入。
3、選取物品的價值與重量的比值大的放入。
第一第二種不能保證得到最優(yōu)解,第三種有的資料說也不能保證得到最優(yōu)解,但是能得到最優(yōu)的近似解。這里選取第三種方法:
1、先選取比值最大的物品。
2、比較其重量是否小于背包容量,如果小,就放入,如果大于背包容量貪心算法 背包問題 c,就對其進行切割。
3、循環(huán)第一步,直到背包容量等于0。
#include
#include
using namespace std;
//找到比值最大的值以及坐標返回坐標,更新最大值

int maxIndex(int n,float max,float a[5])
{
int index=0;
for(int i = 1; i < n; i++)
{
if(a[i] > max)
{
max = a[i];
index = i;
}
}
return index;

}
int main()
{
int n=5; //物品數(shù)
float c=10; //背包容量
float res = 0; //最大價值
float v[5]={6,3,5,4,6}; //物品價值
float w[5]={2,2,6,5,4}; //物品重量
float a[5]; //物品價值比值

float &max = a[0]; //比值最大
int index = 0; //比值最大值的下標
float visit[5]={0}; //該物品取多少
//求出物品價值的比值
for(int i=0;i<5;i++)
a[i]=v[i]/w[i];
index =maxIndex(n,max,a);
//c = 0
while(c > 0)
{
if(w[index] <= c)

{ //如果單價最高者放得下,全放進去
visit[index]=1;
res += v[index];
c -= w[index];
a[index] = 0; //刪除該物品
index =maxIndex(n,max,a);//繼續(xù)找比值最大
}
else
{ //如果放不下,則將物品進行切分
res += c * a[index]; //剩余的裝滿
visit[index]=c/w[index];
c = 0;

}
}
cout<