L3-2 拼题A打卡奖励
太久没刷题了,这题咋一看是01背包,但是直接背复杂度不对,没想明白
直接冲拿了19分,然后想了几分钟没想到反背,但是想到了乱搞的方法,就是如果一个物品如果多次都没能更新 dp 值,那么我就跳过它,改了改居然30分了,果然乱搞大法好!
#include<bits/stdc++.h>
#include<sstream>
using namespace std;
const int maxn = 1e7 + 1011;
int w[maxn], val[maxn];
struct node{
int w, val;
bool operator < (const node &a) const {
return val * a.w > w * a.val;
}
}v[maxn];
int dp[maxn];
signed main() {
int n, m; cin >> n >> m;
dp[0] = 0;
for (int i = 0; i < n; ++ i) cin >> v[i].w;
for (int i = 0; i < n; ++ i) cin >> v[i].val;
for (int i = 0; i < n; ++ i) {
int sz = 0;
for (int j = m; j >= v[i].w; -- j) {
if (dp[j - v[i].w] + v[i].val > dp[j]) dp[j] = dp[j - v[i].w] + v[i].val, sz = 0;
else sz ++;
if (sz == 500) break; // 500 次没更新就跳过
}
}
cout << dp[m] << '\n';
return 0;
}