WA10pts求调

P1064 [NOIP2006 提高组] 金明的预算方案

DTL_2010 @ 2024-05-12 16:38:45

部分背包

#include<bits/stdc++.h>
using namespace std;
vector<int> v[100], w[100];
int n, m, dp[32768];
int main(){
    cin >> m >> n;
    for(int i = 1; i <= n; i++){
        int x, y, z;
        cin >> x >> y >> z;
        if(z != 0){
            for(int j : v[z]) v[z].push_back(x*y+j);
            for(int j : w[z]) w[z].push_back(x+j);
        }
        else{
            v[i].push_back(x*y);
            w[i].push_back(x);
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = m; j >= 0; j--)
            for(int k = 0; k < v[i].size(); k++)
                if(j >= w[i][k]) dp[j] = max(dp[j], dp[j-w[i][k]]+v[i][k]);
    cout << dp[m];
    return 0;
}

by mooktian @ 2024-05-20 10:40:40

@DTL_2010 思路要理顺啊,这题就是有依赖的01背包,依赖关系可以做成一个分组,每个分组里面可能包含有:主件,主件+附件1,主件+附件2,主件+附件1+附件2。

处理完以后就按照01背包分组的模版去写就好了。

你这个怎么处理的我没有看懂。


|