给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 ,价值wi
(1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。
有两类背包问题(根据物品是否可以分割),如果物品不可以分割,称为0—1背包问题(动态规划);如果物品可以分割,则称为背包问题(贪心算法)。
解题思路:根据性价比的高低排序,性价高的先装。
#include
#include
struct page{
int wight;
int price;
float t;
int order;
};
void sort(struct page b[],int n)
{ int i,j;
struct
page temp;
for(i=0;i
for(j=0;j
if(b[j].t
{
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
void main ()
{
int i,w,n;
float sum=0,sumprice=0;
printf("请输入背包能背的重量,物品的个数:\n");
scanf("%d%d",&w,&n);
struct
page *a;
a=(struct page *)malloc(sizeof(struct page)*n);
printf("请输入物品Ni的序号、重量和价格\n");
for(i=0;i
{
scanf("%d%d%d",&a[i].order,&a[i].wight,&a[i].price);
a[i].t=1.0*a[i].price/a[i].wight;
}
sort(a,n);
printf("\n");
for(i=0;i
sum+=a[i].wight;
if(sum
{
for(i=0;i
sumprice+=a[i].price;
printf("物品可全部装入,总价值为%.2f元",sumprice);
}
else
{
sum=0;
sumprice=0;
for(i=0;i
{
sum=sum+a[i].wight;
if(sum>w)
{
sumprice+=(a[i].wight+w-sum)*a[i].t;
printf("装入%d号物品%.2f克\n",a[i].order,a[i].wight+w-sum);
printf("总价值为%.2f元\n",sumprice);
break;
}
printf("装入%d号物品%.2f克\n",a[i].order,a[i].wight*1.0);
sumprice=sumprice+a[i].price;
}
}
}