迷之全WA

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

Grace25 @ 2020-10-31 16:21:16

想直接用有依赖的背包问题的解法做(附件有不止2个)。。。但是全WA了。。。

话说我写这么多循环都没TIE

#include<iostream>
#include<algorithm> 
using namespace std;
int n,s,m=1,dp[1010],dp_f[1010][1010];
struct thing{
    int v,w,h;
}main_item[1010],annex_item[110][110];
int main(){
    int v,w,h;
    cin >> s >> n;
    for(int i=1;i<=n;i++){
        cin >> w >> v >> h;
        if (!h){//是主件 
            main_item[0].h++;//件数加一 
            main_item[main_item[0].h].v = v*w;//储存 
            main_item[main_item[0].h].w = w;
        }else{//是附件 
            annex_item[h][0].h++;//件数加一 
            annex_item[h][annex_item[h][0].h].v = v*w;//储存 
            annex_item[h][annex_item[h][0].h].w = w;
        }
    }   
    for(int i=1;i<=main_item[0].h;i++){
        for(int j=1;j<=annex_item[i][0].h;j++){//对附件进行0-1背包
            w=annex_item[i][j].w; 
            v=annex_item[i][j].v;
            for(int x=s-main_item[i].w;x>=w;x--){ 
                dp_f[i][x]=max(dp_f[i][x],dp_f[i][x-w]+v);
            }
        }
        w=main_item[i].w; 
        v=main_item[i].v;
        for(int j=s;j>=w;j--){//对主件进行0-1背包 
            dp[j]=max(dp[j],max(dp[j-w]+v,dp[j-w]+v+dp_f[i][s-w]));
        }
    }
    cout << dp[s];
    return 0;
}

by 旭日临窗 @ 2020-10-31 18:36:51

@Grace25

我把我的代码发给你吧

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3.2 * 1e4 + 10;
int n,m,V,p,q,v[100],w[100],fw[100][5],fv[100][5],dp[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++)
    {
        scanf("%d%d%d",&V,&p,&q);
        if(q == 0)
        {
            v[i] = p * V;
            w[i] = V;
        }
        else
        {
            fv[q][0]++;
            fv[q][fv[q][0]] = V * p;
            fw[q][fv[q][0]] = V;
        }
    }
    for(int i = 1;i <= m;i++)
    {
        for(int j = n;j >= w[i];j--)
        {
            dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
            if(j >= w[i] + fw[i][1]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][1]] + v[i] + fv[i][1]);
            if(j >= w[i] + fw[i][2]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][2]] + v[i] + fv[i][2]);
            if(j >= w[i] + fw[i][1] + fw[i][2]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][1] - fw[i][2]] + v[i] + fv[i][1] + fv[i][2]);
        }
    }
    printf("%d",dp[n]);
    return 0;
}

|