10分求调P1064金明的预算方案
  • 板块学术版
  • 楼主qscpknfhty
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/1/24 17:26
  • 上次更新2025/1/24 19:04:17
查看原帖
10分求调P1064金明的预算方案
1592168
qscpknfhty楼主2025/1/24 17:26
#include <bits/stdc++.h>
using namespace std;
int n,m,v[65],pp[65],q[65];
struct node{
	int val,val1,val11,val2,v,v1,v11,v2,p,p11,p1,p2,q,pos,num;
}a[65];
int f[65][32005];
int main()
{
	cin >> n >> m;
	int p = 1;
	for (int i = 1;i <= m;i++)
	{
		cin >> v[i] >> pp[i] >> q[i];
		if (q[i] == 0)
		{
			a[p].val = pp[i] * v[i];
			a[p].v = v[i];
			a[p].q = q[i];
			a[p].pos = i;
			a[p].num = 0;
			p++;
		}
	}
	p--;
	for (int i = 1;i <= p;i++)
	{
		for (int j = 1;j <= m;j++)
		{
			if (q[j] == a[i].pos)
			{
				if (a[i].num == 0)
				{
					a[i].val1 = a[i].val + pp[j] * v[j];
					a[i].v1 = a[i].v + v[j];
					a[i].num++;
				}
				else if (a[i].num == 1)
				{
					a[i].val2  = a[i].val1 + pp[j] * v[j];
					a[i].v2 = a[i].v1 + v[j];
					a[i].val11 = a[i].val + pp[j] * v[j];
					a[i].v11 = a[i].v + v[j];
					a[i].num++;
				}
			}
		}
	}
	for (int i = 1;i <= p;i++)
	{
		for (int j = 0;j <= n;j++)
		{
			f[i][j] = f[i - 1][j];
			if (j >= a[i].v2)
			{
				f[i][j] = max(f[i - 1][j],max(f[i - 1][j - a[i].v] + a[i].val,max(f[i - 1][j - a[i].v1] + a[i].val1,max(f[i - 1][j - a[i].v11] + a[i].val11,f[i - 1][j - a[i].v2] + a[i].val2))));
			}
			else if (j >= a[i].v1 && j <= a[i].v11)
			{
				f[i][j] = max(f[i - 1][j],f[i - 1][j - a[i].v1] + a[i].val1);
			}
			else if (j >= a[i].v11 && j <= a[i].v1)
			{
				f[i][j] = max(f[i - 1][j],f[i - 1][j - a[i].v11] + a[i].val11);
			}
			
			else if (j >= a[i].v1 && j >= a[i].v11)
			{
				f[i][j] = max(f[i - 1][j],max(f[i - 1][j - a[i].v1] + a[i].val1,f[i - 1][j - a[i].v11] + a[i].val11));
			}
		}
	}
	cout << f[p][n];
	return 0;
} 

非常优秀地分类讨论力 过了样例,有的测试点会算出更大的值

我的码风需要改进吗?

2025/1/24 17:26
加载中...