为啥是30分
  • 板块P1776 宝物筛选
  • 楼主_Fxlt_
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/4/28 21:25
  • 上次更新2023/10/28 02:42:32
查看原帖
为啥是30分
541522
_Fxlt_楼主2022/4/28 21:25
#include<iostream>
using namespace std;
int dp[40001];
int w[100001];
int v[100001];
int c[100001];
int main()
{
	int W, n;
	cin >> n >> W;
	for (int i = 1; i <= n; i++)
	{

		cin >> v[i] >> w[i] >> c[i];

	}
	/*
	for (int i = 1; i <= n; i++)
	for (int j = W; j > 0; j--)
	{
		j >= w[i] && dp[j - w[i]] + v[i] > dp[j] ? dp[j] = dp[j - w[i]] + v[i] : dp[j] = dp[j];
	}
	cout << dp[W] << "\n";*/
	for (int i = 0; i <= W; i++)
	{
		dp[i] = 0;
	}
	for (int i = 1; i <= n; i++)
	{
		if (c[i]*w[i] > W)//完全
		{
			for (int j = 1; j <= W; j++)
			{
				j > w[i] && dp[j - w[i]] + v[i] > dp[j] ? dp[j] = dp[j - w[i]] + v[i] : dp[j] = dp[j];
			}
		}
		else//01
		{
			for (int y = 1; c[i] > 0; y<<=2)
			{
				int k = min(y, c[i]);
				for (int j = W; j >= w[i]*k; j--)
				{
					dp[j] = max(dp[j],dp[j-w[i]*k]+v[i]*k);
				}
				c[i] -= y;
			}
		}
	}
	cout << dp[W];
}
2022/4/28 21:25
加载中...