uva 12325

乍一看题目像是dp,然而数据量很大

题意是给你两种物品 价值V1,V2  大小S1,S2 让你用一个大小是C的背包去装 

性价比高的物品肯定要优先装入,问题是s1和s2可能都很小,导致枚举数量极大

可以有另一种枚举法,s2个物1和s1个物2,体积相等,价值为s2*v1 s1*v2 按照性价比的思路就可以了

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(int argc, char const *argv[])
{
	int kase = 0;
	cin >> kase;
	for (int T = 1; T <= kase; T++)
	{
		int n, s1, v1, s2, v2;
		cin >> n >> s1 >> v1 >> s2 >> v2;
		if (s1 > s2)
		{
			swap(s1, s2);
			swap(v1, v2);
		}
		LL ans = 0;
		if (n / s2 >= 65536)
		{
			for (LL i = 0; i <= s1; i++)
				ans = max(ans, v2 * i + (n - s2 * i) / s1 * v1);
			for (LL i = 0; i <= s2; i++)
				ans = max(ans, v1 * i + (n - s1 * i) / s2 * v2);
		}
		else
		{
			for (LL i = 0; s2 * i <= n; i++)
				ans = max(ans, v2 * i + (n - s2 * i) / s1 * v1);
		}
		cout << "Case #" << T << ": " << ans << endl;
	}
	return 0;
}

你可能感兴趣的:(uva 12325)