自认逻辑自洽,求调QAQ

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

一个句号 @ 2023-07-14 16:10:24

#include<iostream>
#define ll long long
using namespace std;
const int maxn=32005;
ll ww[65],vv[65],p[65];
ll w[65],v[65];
ll c1[65][maxn],c2[65][maxn];
ll dp[maxn],cnt[65];//以容积为数组下标 
ll n,W;
ll ans;
/*
*/
int maxx(int a,int b,int c,int d,int e){
    int ans=a;
    if(b>ans)ans=b;
    if(c>ans)ans=c;
    if(d>ans)ans=d;
    if(e>ans)ans=e;
    return ans;
}
int main(){
    cin>>W>>n;
    for(int i=1;i<=n;i++){
        cin>>ww[i]>>vv[i]>>p[i];
        vv[i]*=ww[i];
        //主附件依赖问题的处理?
        if(p[i]==0){
            c1[i][0]=ww[i];
            c2[i][0]=vv[i];
            continue;
        } 
        cnt[p[i]]++;
        c1[p[i]][cnt[p[i]]]=ww[i];//第几个数的第几个 
        c2[p[i]][cnt[p[i]]]=vv[i];//主件怎么办? 
    }
    int t=0;
    for(int i=1;i<=n;i++){
        if(cnt[i]==0&&p[i]==0) {//一种情况,只买主件 
            w[++t]=c1[p[i]][0],v[t]=c2[p[i]][0];            
        }
        if(cnt[i]==1){//两种情况,只买主件或主+1副 
            w[++t]=c1[p[i]][0],v[t]=c2[p[i]][0];
            w[++t]=c1[p[i]][1]+w[t-1],v[t]=c2[p[i]][1]+v[t-1];
        }
        if(cnt[i]==2){//三种情况
            w[++t]=c1[p[i]][0],v[t]=c2[p[i]][0];
            w[++t]=c1[p[i]][1]+w[t-1],v[t]=c2[p[i]][1]+v[t-1];
            w[++t]=c1[p[i]][2]+w[t-2],v[t]=c2[p[i]][2]+v[t-2];
            w[++t]=w[t-1]+w[t-2]+w[t-3],v[t]=v[t-1]+v[t-2]+v[t-3];
        }
    }
    for(int i=1;i<=t;i++)
        cout<<v[i]<<" ";
        cout<<endl;
    for(int i=1;i<=t;i++)
        cout<<w[i]<<" ";
        cout<<endl;
    //背包处理 
    for(int i=1;i<=t;i++)
        for(int k=i;k<=i+cnt[i];k++){
            if(p[i]==0)continue;
            for(int  j=W;j>=w[i];j--){
                dp[j]=max(dp[j],dp[j-w[k]]+v[k]);
            }
        }
    cout<<dp[W];
    return 0;
}

by 一个句号 @ 2023-07-14 16:11:17

看了一下数组,存的时候出问题了,wv数组没存好,但没明白是哪里错了QAQ


|