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;
}


posted @ 2022-04-22 15:42  wansheking  阅读(127)  评论(0)    收藏  举报