沐里纷纷


私信TA

用户名:Epoch

访问量:68664

签 名:

我不会算法

等  级
排  名 38
经  验 13517
参赛次数 1
文章发表 172
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

不会算法

解题思路:

各位dalao可能想多了,这题不是01背包,而是部分背包。看到输入是整数但是答案居然有小数应该就明白了...

根本不用dp,直接贪心解决了

注意事项:

参考代码:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <math.h>
#include <algorithm>

using namespace std;

class Item{
public:
	int p, g;
	double pPerG;
	Item(){
	}
	Item(int g, int p) : g(g), p(p){
		pPerG = 1.0*p/g;
	}
};

vector<Item> itemArr;

bool cmp(Item a, Item b)
{
	return a.pPerG > b.pPerG;
}

int main(void)
{
//不是01背包...
//	int n, w;
//	cin >> n >> w;
//	for (int i = 0; i < n; i++)
//		cin >> g[i] >> p[i];
//	for (int i = 0; i < n; i++)
//		for (int j = w; j >= g[i]; j--)
//			dp[j] = dp[j] > dp[j - g[i]] + p[i] ? dp[j]: dp[j - g[i]] + p[i];
//	cout << dp[w - 1] << endl;

	//部分背包,使用贪心解决
	int n, w;
	cin >> n >> w;
	for (int i = 0; i < n; i++)
	{
		int g, p;
		cin >> g >> p;
		itemArr.push_back(Item(g, p));
	}

	sort(itemArr.begin(), itemArr.end(), cmp);

	double ans = 0;
	vector<Item>::iterator it = itemArr.begin();
	while(w && it < itemArr.end())
	{
		int itemG = it->g;
		if (w > itemG)
		{
			w -= itemG;
			ans += it->p;
		}
		else
		{
			ans += it->pPerG * w;
			w -= w;
		}
		it++;
	}

	fclose(stdin);
	return 0;
}


 

0.0分

0 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »