『壹』 急,分全拿出來了,演算法中的背包問題的貪心演算法
#include <stdio.h>
#include <iostream.h>
#define MAXWEIGHT 20
#define n 3
float pw[n]={0},x[n]={0};
int w[n]={0},p[n]={0};
void sort(int p[],int w[])
{
int temp1,temp2;
float temp;
int i,j;
for(i=0;i<n;i++)
{
pw[i]=float(p[i])/w[i];
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(pw[i]<pw[j])
{
temp=pw[i],pw[i]=pw[j],pw[j]=temp;
temp1=p[i],temp2=w[i];
p[i]=p[j],w[i]=w[j];
p[j]=temp1,w[j]=temp2;
}
}
}
}
void GreedyKnapsack(int p[],int w[])
{
int m=MAXWEIGHT,i;
for(i=0;i<n;i++) x[i]=0.0;
for(i=0;i<n;i++)
{
if(w[i]>m) break;
x[i]=1.0;
m=m-w[i];
}
if(i<n) x[i]=float(m)/w[i];
}
void main()
{
int i;
printf("請輸入每個物體的效益和重量:\n");
for(i=0;i<n;i++)
{
cin>>p[i]>>w[i];
}
for(i=0;i<n;i++)
{
printf("原物體%d的效益和重量分別為%d,%d:\n",i+1,p[i],w[i]);
}
sort(p,w);
printf("\n\n\n按效益值非遞增順序排列物體:\n");
for(i=0;i<n;i++)
{
printf("物體%d的效益和重量分別為%d,%d 效益值為:%f\n",(i+1),p[i],w[i],pw[i]);
}
GreedyKnapsack(p,w);
printf("\n\n\n最優解為:\n");
for(i=0;i<n;i++)
{
printf("第%d個物體要放%f:\n",i+1,x[i]);
}
}
這是正確的演算法
『貳』 求背包問題貪心演算法實例結果
找零錢問題:以人民幣1元,2元,5元,10元,20元,50元,100元為例,要求所找的張數最少
背包問題:假設物體重量W1,W2...Wn其對應的價值為P1,P2...Pn,物體可分割,求裝入重量限制為m的背包中的物體價值最大.可用P/W來解答.
#include<iostream>
#include<algorithm>
using namespace std;
struct good//表示物品的結構體
{
double p;//價值
double w;//重量
double r;//價值與重量的比
}a[2000];
double s,value,m;
int i,n;
bool bigger(good a,good b)
{
return a.r>b.r;
}
int main()
{
scanf("%d",&n);//物品個數
for (i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].w,&a[i].p);
a[i].r=a[i].p/a[i].w;
}
sort(a,a+n,bigger);//調用sort排序函數,你大概不介意吧,按照價值與重量比排序貪心
scanf("%lf",&m);//讀入包的容量m
s=0;//包內現存貨品的重量
value=0;//包內現存貨品總價值
for (i=0;i<n&&s+a[i].w<=m;i++)
{
value+=a[i].p;
s+=a[i].w;
}
printf("The total value in the bag is %.2lf.\n",value);//輸出結果
return 0;
}
『叄』 貪心演算法 部分背包問題
[背包問題]有一個背包,背包容量是M=150。有7個物品,物品可以分割成任意大小。
要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。
物品 A B C D E F G
重量 35 30 60 50 40 10 25
價值 10 40 30 50 35 40 30
分析:
目標函數: ∑pi最大
約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150)
(1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優?
(2)每次挑選所佔重量最小的物品裝入是否能得到最優解?
(3)每次選取單位重量價值最大的物品,成為解本題的策略。 ?
值得注意的是,貪心演算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的演算法。
貪心演算法還是很常見的演算法之一,這是由於它簡單易行,構造貪心策略不是很困難。
可惜的是,它需要證明後才能真正運用到題目的演算法中。
一般來說,貪心演算法的證明圍繞著:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。
對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:
(1)貪心策略:選取價值最大者。反例:
W=30
物品:A B C
重量:28 12 12
價值:30 20 20
根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。
(2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。
(3)貪心策略:選取單位重量價值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
價值:28 20 10
根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。
『肆』 用貪心演算法解決背包問題
用貪心演算法解決背包問題,首先要明白,結果不一定是全局最優的。對於貪心法而言,首先步驟是找到最優度量標准,我這里的演算法採用的最優度量標準是: 收益p/重量w 的值最大者優先放入背包中,所以有演算法如下:void GreedyKnapsack(float * x){ //前置條件:w[i]已按p[i]/w[i]的非增次序排列 float u=m; //u為背包剩餘載重量,初始時為m for(int i=0;i<n;i++) x[i]=0; //對解向量x初始化 for(i=0;i<n;i++){ //按最優度量標准選擇的分量 if(w[i]>u) break; x[i]=1.0; u=u-w[i]; } if(i<n) x[i]=u/w[i];}
『伍』 關於一道C語言的背包問題,用的是貪心演算法
#include "iostream.h"
#include "stdio.h"
#include <cstdlib>
struct stone
{
int name;
int weight;//物品的剩餘重量
int weight_t;//物品的重量
float benefit;//物品的價值
//float b;
};
//按物品的效益排序
void sort(stone *data,int num)
{
//僅剩一個元素時排序完畢
if(num<1)
return;
int low=0,high=num;
stone key_s=data[low];//取數組的第一個作為關鍵字
float key=(float)key_s.benefit/key_s.weight;
int empty=low;//目標位置初始位置為low指向的位置
while(low<high)
{
if(low==empty)//後面的指針向前走
{
//找到比關鍵字小的元素把它移到low指向的位置
while((data[high].benefit/data[high].weight<key)&&(high>low))
{
high--;
}
if(data[high].benefit/data[high].weight>=key)
{
data[low]=data[high];
empty=high;
}
}
else if(high==empty)//前面的指針向後走
{
//找到比關鍵字大的元素把它移到high指向的位置
while((data[low].benefit/data[low].weight>=key)&&(low<high))
{
low++;
}
if(data[low].benefit/data[low].weight<key)
{
data[high]=data[low];
empty=low;
}
}
}
data[empty]=key_s;//把關鍵字放到劃分完畢後兩部分的中間位置
//關鍵字前面的數列繼續遞推
if(empty>1)
sort(data,empty-1);
//關鍵字後面的數列繼續遞推
if(num-empty-1>0)
sort(data+empty+1,num-empty-1);
}
//輸入物品的信息
void inputstone(stone *bag,int num)
{
for(int i=0;i<num;i++)
{
bag[i].name=i+1;//物品的名字
printf("請輸入第%d號物品的重量:",i+1);
scanf("%d",&bag[i].weight);
if (bag[i].weight<=0)
{printf("物品的重量必須大於0!\n");}
printf("請輸入第%d號物品的價值:",i+1);
scanf("%f",bag[i].benefit);
if (bag[i].benefit<=0)
{printf("物品的價值必須大於0!\n");}
bag[i].weight_t=bag[i].weight;
}
}
//主函數
int main(int argc, char* argv[])
{ int i;
int num=0;//放入物品的數量
int weight=0;//背包可容納的重量
float benefit=0;//總效益
stone *bag;//物品
/////輸入背包可容納的重量
do
{
printf("請輸入背包可容納的重量:");
scanf("%d",&weight);
if (weight<=0)
printf("背包可容納的重量必須大於0!\n");
}while(weight<=0);
//輸入物品種類
do
{
printf("請輸入物品的數量:");
scanf("%d",&num);
if (num<=0)
printf("物品數量必須大於0!\n");
}while(num<=0);
bag=new stone[num];//物品數組
inputstone(bag,num);//輸入物品的信息
sort(bag,num-1);//按單位效益排序
for(i=0;i<num&&weight>0;i++)
{
stone *temp=bag+i;
if(weight>=temp->weight)
{
weight-=temp->weight;
temp->weight=0;
benefit+=temp->benefit;
continue;
}
else
{
temp->weight-=weight;
weight=0;
benefit+=(temp->benefit*(1-(float)temp->weight/temp->weight_t));
break;
}
}
////////輸出結果//////////
printf("物品種類 放入的比例 每單位效益 ");
for(i=0;i<num;i++)
{
stone *temp=bag+i;
printf("%d類物品",temp->name);
printf("\t\t%.2f\t\t",(temp->weight_t-temp->weight)/(float)temp->weight_t);
printf(" %.4f\n",temp->benefit/(float)temp->weight_t);
}
printf("總效益:%.2f",benefit);
delete bag;
getchar();
system("PAUSE");
return EXIT_SUCCESS;
return 0;
}
『陸』 動態規劃背包問題與貪心演算法哪個更優
首先這兩個演算法是用來分別解決不同類型的背包問題的,不存在哪個更優的問題。
當一件背包物品可以分割的時候,使用貪心演算法,按物品的單位體積的價值排序,從大到小取即可。
當一件背包物品不可分割的時候,(因為不可分割,所以就算按物品的單位體積的價值大的先取也不一定是最優解)此時使用貪心是不對的,應使用動態規劃。
『柒』 請問各位大蝦:怎樣用貪心演算法解決背包問題
貪心只能解決物品可以分割的背包問題,01背包得用動態規劃求解
『捌』 0-1背包問題具有貪心選擇性質嗎證明之
首先按物品的重量從小到大排序。貪心選擇性質說的就是每次都是都是選取當前的最優值。假設背包問題每次都是從重量最小的物品開始選擇的,那他一定滿足貪心選擇性質,假設背包問題不是從重量最小的物品開始選擇的,那麼說明重量最小的物品沒有裝入,現在我們用這個重量最小的物品代替當前選擇裝入的物品,依然可以得到一個最優解(裝入的物品的個數相同)。所以背包問題具有貪心選擇性質
『玖』 0/1背包問題能不能使用貪心法解決
貪心演算法解決背包問題有幾種策略:
(i)一種貪婪准則為:從剩餘的物品中,選出可以裝入背包的價值最大的物品,利用這種規則,價值最大的物品首先被裝入(假設有足夠容量),然後是下一個價值最大的物品,如此繼續下去。這種策略不能保證得到最優解。例如,考慮n=2, w=[100,10,10], p =[20,15,15], c = 105。當利用價值貪婪准則時,獲得的解為x= [ 1 , 0 , 0 ],這種方案的總價值為2 0。而最優解為[ 0 , 1 , 1 ],其總價值為3 0。
(ii)另一種方案是重量貪婪准則是:從剩下的物品中選擇可裝入背包的重量最小的物品。雖然這種規則對於前面的例子能產生最優解,但在一般情況下則不一定能得到最優解。考慮n= 2 ,w=[10,20], p=[5,100], c= 2 5。當利用重量貪婪策略時,獲得的解為x =[1,0], 比最優解[ 0 , 1 ]要差。
(iii)還有一種貪婪准則,就是我們教材上提到的,認為,每一項計算yi=vi/si,即該項值和大小的比,再按比值的降序來排序,從第一項開始裝背包,然後是第二項,依次類推,盡可能的多放,直到裝滿背包。
有的參考資料也稱為價值密度pi/wi貪婪演算法。這種策略也不能保證得到最優解。利用此策略試解n= 3 ,w=[20,15,15], p=[40,25,25], c=30 時的最優解。雖然按pi /wi 非遞(增)減的次序裝入物品不能保證得到最優解,但它是一個直覺上近似的解。
而且這是解決普通背包問題的最優解,因為在選擇物品i裝入背包時,可以選擇物品i的一部分,而不一定要全部裝入背包,1≤i≤n。
『拾』 用貪心演算法求解背包問題的最優解。
你這個是部分背包么?也就是說物品可以隨意分割?
那麼可以先算出單位重量物品的價值,然後只要從高價值到低價值放入就行了,按p[i]/w[i]降序排序,然後一件一件加,加滿為止!
貪心的思路是:加最少的重量得到更大的價值!
算出單位價值為{6,4,3,2,7,5,2}
加的順序即為5,1,6,2,3,4/7
如果重量不超過就全部都加,超過就加滿為止
不懂可問望採納!
推薦看dd_engi的背包九講,神級背包教程!在此膜拜dd_engi神牛~