SHAOXIAOJ正在加载中...

2623: 贪心算法-背包问题

金币值:3 定数:6 时间限制:1.000 s 内存限制:128 M
正确:6 提交:7 正确率:85.71% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 算法设计

题目描述

给定n(1<=x<=20)种不同的物品和一背包。物品i (1≤i≤n) 的重量是wi (wi 是大于 0的整数),其价值为vi(vi 是大于 0的整数),背包的容量为c (c 是大于 0的整数)。问应如何选择装入背包的物品(可以装入某个物品的一部分),使得装入背包中物品的总价值最大? 假设两个物品的价值重量之比相等则优先选择编号小的物品。

测试代码   复制

#include <stdio.h>
struct good {
	int w,v,id;  //w,v,id分别表示物品的重量,价值和编号
	double x;	   //x在0-1之间取值,表示该物品需要放多少到背包中
	double ratio; //单位重量的价值
};

void f(struct good goods[],int n,int c) {
	for(int i=1; i<=n; i++) {
		
	}
}

void sort(struct good goods[],int n) {
	for(int i=1; i<=n-1; i++) { ///冒泡排序(降序)
		for(int j=1; j<=n-i; j++) {
			if(goods[j].ratio<goods[j+1].ratio) {
				struct good temp;
				temp=goods[j];
				goods[j]=goods[j+1];
				goods[j+1]=temp;
			}
		}
	}
}

int main(void) {
	int i,n,c;
	struct good goods[21]; //0号单元不存储有效数据
	scanf("%d %d", &n,&c);
	for(i=1; i<=n; i++) {
		scanf("%d", &goods[i].w);
	}
	for(i=1; i<=n; i++) {
		scanf("%d", &goods[i].v);
	}
	for(i=1; i<=n; i++) {
		goods[i].id=i;
		goods[i].x=0;
		goods[i].ratio=1.0*goods[i].v/goods[i].w;
	}
	sort(goods,n);
	f(goods,n,c);
	for(i=1; i<=n; i++) {
		printf("%d %.2f\n",goods[i].id,goods[i].x);
	}
	return 0;
}

输入格式

第一行输入物品的个数以及背包的容量n和c
第二行输入每个物品的重量
第三行输入每个物品的价值

输出格式

输出n行,每行有两个数,第一个整数表示物品的编号(物品的编号按贪心选择的顺序输出),第二个实数表示对应物品的取舍情况(保留两位小数)

输入样例    复制

4 50
20 30 10 5
100 120 60 2

输出样例    复制

3 1.00
1 1.00
2 0.67
4 0.00