无脑分组法
手动无脑分组,再也没有写诗的感觉
1、给一个根p,就放p进组;
2、给一个节点a,放就放p,a进组;
3、如果又给了一个节点b,那么以p为根的组,组员数目为3,那就不仅要放p,b进组,还要放p,a,b进组。
4、w表示最终价值。
C++ 代码
#include<iostream>
#include<vector>
using namespace std;
int s[70];
int mp[70];
int v[70][70], w[70][70];
int f[32010];
int main()
{
int n, m;
cin >> n >> m;
int group = 0;
for (int i = 1; i <= m; i ++ )
{
int a, b, c;
cin >> a >> b >> c;
if (c == 0)
{
group ++;
mp[i] = group;
s[group] = 1;
v[group][1] = a;
w[group][1] = b * a;
}
else if(a + v[mp[c]][1] <= n)
{
int temp_g = mp[c];
s[temp_g] += 1;
v[temp_g][s[temp_g]] = a + v[temp_g][1];
w[temp_g][s[temp_g]] = b * a + w[temp_g][1];
if (s[temp_g] == 3)
{
s[temp_g] += 1;
v[temp_g][4] = v[temp_g][2] + a;
w[temp_g][4] = w[temp_g][2] + b * a;
}
}
}
for (int i = 1; i <= group; i ++ )
{
for (int j = n; j >= 0; j -- )
{
for (int k = 1; k <= s[i]; k ++ )
{
if (j >= v[i][k])
{
f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
}
}
}
}
cout << f[n];
return 0;
}