贪心-背包问题(C)
【习题描述】
【题目描述】
现在有很多物品(物品数量少于100个,它们是可以分割的),已知每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
【输入说明】
每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
【输出说明】
输出每组测试数据中背包内的物品的价值和
【输入样例】
3 15
5 10
2 8
3 9
【输出样例】
65
#include <stdio.h>
#define MAX 1000
int n,c;
struct Object
{
int value;
int weight;
double rate;
}Obj[MAX];
void sort( struct Object A[]);
void load( struct Object A[]);
int main()
{
scanf("%d %d",&n,&c);
for(int i=0;i<n;i++)
{
scanf("%d %d",&Obj[i].value,&Obj[i].weight);
Obj[i].value = Obj[i].value*Obj[i].weight;
Obj[i].rate=Obj[i].value/(Obj[i].weight*1.0);
}
sort(Obj);
load(Obj);
}
void sort(struct Object A[])
{
int i,j;
for (i = 0 ; i < n - 1 ; i++)
{
int a = i;
for (j = i + 1; j < n; j++)
if (A[j].rate > A[a].rate)
{
a = j;
}
struct Object temp=A[a];
A[a]=A[i];
A[i]=temp;
}
}
void load(struct Object A[])
{
int D=0,E=0; //D 为最大重量, E 为最大价值
for(int i=0;i<n;i++)
{
if(A[i].weight<=c)
{
E+=A[i].value; //保存最大价值
D+=A[i].weight; //保存最大重量
c-=A[i].weight; //更新背包剩余重量
}
else
{
int demo=(A[i].value/A[i].weight*1.0)*c;
E+=demo;
D+=demo*A[i].weight/A[i].value*1.0;
break; //背包已装满,跳出循环
}
}
printf("%d",E);
}