Mikamedo @ 2018-08-15 16:47:10
#include<iostream>
using namespace std;
struct thing
{
int v;
int p;
int q;
thing *f1;
thing *f2;
}a[65];
int n, m;
bool firstf[65] = { true };
int ans;
void DFS(int k, int sumofmoney,int sum)
{
if (sumofmoney > n)
return;
else if (k == m + 1)
{
if (sum > ans)
ans = sum;
return;
}
else if (a[k].q > 0)
{
DFS(k + 1, sumofmoney, sum);
return;
}
DFS(k + 1, sumofmoney + a[k].v, sum + a[k].v*a[k].p);
DFS(k + 1, sumofmoney, sum);
if (a[k].f1 != NULL)
DFS(k + 1, sumofmoney + a[k].v + a[k].f1->v,sum + a[k].v*a[k].p + a[k].f1->v*a[k].f1->p);
else if(a[k].f2!=NULL)
DFS(k + 1, sumofmoney + a[k].v + a[k].f2->v,sum + a[k].v*a[k].p + a[k].f2->v*a[k].f2->p);
if (a[k].f2 != NULL && a[k].f1 != NULL)
DFS(k + 1, sumofmoney + a[k].v + a[k].f1->v + a[k].f2->v, sum + a[k].v*a[k].p + a[k].f1->v*a[k].f1->p + a[k].f1->v*a[k].f1->p);
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> a[i].v >> a[i].p >> a[i].q;
if (a[i].q > 0)
{
if (firstf[i])
{
a[a[i].q].f1 = &a[i];
firstf[i] = false;
}
else
a[a[i].q].f2 = &a[i];
}
}
DFS(1, 0, 0);
cout << ans;
}
by Mikamedo @ 2018-08-15 16:49:27
@A_P_I果然还是我太菜了吗
by Hexarhy @ 2018-08-15 17:11:55
@A_P_I~~ 我觉得你还需要一个构造函数QWQ~~
by xjyf @ 2018-08-15 17:15:36
这题好像不用这么麻烦 直接用01背包就行了 列一下动态转移方程 再进行标准的背包套路 一切都解决了
by xjyf @ 2018-08-15 17:21:00
f2[i]=max(f2[i],f2[i-a[j].p]+a[j].v),f1[i]=max(f1[i],f2[i]) a[j].p 即价格 v[j], a[j].v 即重要性 w[j]
by Mikamedo @ 2018-08-16 12:52:29
@xjyf 嗯……我用的难道不是背包(ノ`Д)ノ 天哪!
by Mikamedo @ 2018-08-16 12:54:33
@黄H睿R
by Mikamedo @ 2018-08-16 12:57:19
by Mikamedo @ 2018-08-16 12:58:17
啊~
by xjyf @ 2018-08-16 14:54:52
@A_P_I眼瞎。。。。。。结构体加指针,这么华丽的程序亮瞎了我的眼
by Mikamedo @ 2018-08-16 16:33:33
@xjyf
555 不,是我的菜蒙蔽了你的双眼qwq