一、0-1背包问题
装船问题
某船最大载重量为m吨,现有n件货物供选择装船,每件货物的重量和价值不同。那么从这n件货物中挑选若干件上船,在满足货物总重量<=m的前提下,如何装船才能使运走的货物的总价值最大?
【分析】从价重比(价格/重量)入手,计算每件货物的价重比后,按价重比从大到小排序,在不超重的情况下从价重比最大的货物开始装船。贪心策略正体现在这一点。
源代码:
#include <stdio.h>
#define maxn 100
struct goods
{
double w; //货物重量
double p; //货物价值
double pw; //货物价重比
}g[maxn];
void sort(struct goods g[],int n) //按货物价重比由大到小排序
{
int i,j;
struct goods t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(g[j].pw<g[j+1].pw)
{
t=g[j];
g[j]=g[j+1];
g[j+1]=t;
}
}
}
}
int main()
{
int i,j,n,m;
double sumw,sump; //装上船的货物总重量和总价值
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)