看了y总和题解区的解法,非常优秀。但是这道题可以用更[通用]的做法,不用STL,直接分组背包,拆出价值w和价格V就可以了。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 62, M = 32010;
int n, m;
int f[N][M];
int w[N][M];
int V[N][M];
int cnt[N];
int main()
{
cin>>m>>n;
for(int i=1; i<=n; ++i)
{
int v, p, q;
cin>>v>>p>>q;
if(q == 0)
{
w[i][++cnt[i]] = v*p;
V[i][cnt[i]] = v;
}
else
{
if(cnt[q] == 1)
{
w[q][++cnt[q]] = v*p+w[q][1];
V[q][cnt[q]] = v+V[q][1];
}
else
{
w[q][++cnt[q]] = v*p+w[q][1];
V[q][cnt[q]] = v+V[q][1];
w[q][++cnt[q]] = v*p+w[q][2];
V[q][cnt[q]] = v+V[q][2];
}
}
}
for(int i=1; i<=n; ++i)
for(int j=0; j<=m; ++j)
{
f[i][j] = f[i-1][j];
for(int k=1; k<=cnt[i]; ++k)
if(j>=V[i][k])
f[i][j] = max(f[i][j], f[i-1][j-V[i][k]]+w[i][k]);
}
cout<<f[n][m]<<endl;
return 0;
}
现在有一个数据过不了
#### 输入
#### 输出
#### 标准答案
orz, 大佬可以解释一下输入里面的else嘛,有点没太理解,但是我感觉对应的应该是y总里枚举二进制的那一步,但是不太清楚原理....
和我的想法一样hhh
终于找到没空间优化的了,我是fw55555