貪心演算法--揹包問題
1. 揹包問題
給定n種物品和一個揹包。物品i的重量是Wi,其價值為Vi,揹包的容量為C。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大? (說明,以下演算法與教材147頁給出的演算法思想是一樣的,教材上的演算法事先對物品資訊進行了排序)
void Knapsack(int n,float M,float v[],float w[],float x[])
{
Sort(n,v,w);
int i;
for (i=1;i<=n;i++) x[i]=0;
float c=M;
for (i=1;i<=n;i++) {
if (w[i]>c) break;
x[i]=1;
c-=w[i];
}
if (i<=n) x[i]=c/w[i];//最後一個物品選擇部分裝入
}
具體程式碼:
#include<stdio.h>
float Knapsack(float *w,float *v,float *x,float c,int n)
{
int i,j,l;
float temp,sum=0;
float *a=new float[n];
for(i=0;i<n;i++)a[i]=v[i]/w[i];
printf("\n");
printf("以下分別是物品的重量、價值、價值/重量: \n");
for(i=0;i<n;i++)
{
printf("%f\t%f\t%f\t",w[i],v[i],a[i]);
printf("\n");
}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
temp=w[j];
w[j]=w[j+1];
w[j+1]=temp;
temp=v[j];
v[j]=v[j+1];
v[j+1]=temp;
}
}
printf("\n");
printf("以下根據價值/重量從低到高排序的w[] v[] a[] : \n");
for(i=0;i<n;i++)printf("%f %f %f\n",w[i],v[i],a[i]);
printf("\n");
for(l=n-1;l>=0;l--)
{
if(w[l]<=c)
{
x[l]=1;
sum=sum+v[l];
c=c-w[l];
}
else break;
}
x[l]=c/w[l];
sum=sum+x[l]*v[l];
delete []a;
printf("排序後的物品分別裝入入揹包多少:\n");
for(i=0;i<n;i++)
printf("%f ",x[i]);
printf("\n\n");
printf("揹包裝東西后最大總價值為:%f\n",sum);
printf("\n");
return sum;
}
void main()
{
int n,i;
float c;
printf("揹包的重量為: ");
scanf("%f",&c);
printf("\n");
printf("一共有n個物品,n的值為: ");
scanf("%d",&n);
printf("\n");
float *w=new float[n];
float *v=new float[n];
float *x=new float[n];
printf("請分別輸入物品的重量、價值(列如物品一:20 60(換行輸入物品二)):\n");
for(i=0;i<n;i++)
{
scanf("%f %f",&w[i],&v[i]);
}
Knapsack(w,v,x,c,n);
delete []w;
delete []v;
delete []x;
}
結果截圖: