1维背包做为什么30分

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

yagyagyag @ 2019-01-31 10:14:42

#include<bits/stdc++.h>
using namespace std;
int n,m,v,p,q,a[100][3],b[100][3],f[999999];
void dp();
int main()
{
    cin>>n>>m;
    for (int i=1;i<=m;i++){
        cin>>v>>p>>q;
        if (!q)
        {
            a[i][0]=v;
            b[i][0]=p;
        }
        else 
        {
            if (!a[i][1]){
                a[q][1]=v;
                b[q][1]=p;
            }
            else {
                a[q][2]=v;
                b[q][2]=p;
            }
        }
    }
    dp();
    return 0;
}
void dp()
{
    for (int i=1;i<=m;i++)
        for (int j=n;j>=0;j--){
            if (j-a[i][0]>=0){
                f[j]=max(f[j],f[j-a[i][0]]+a[i][0]*b[i][0]);
                if (j-a[i][0]-a[i][1]>=0)
                    f[j]=max(f[j],f[j-a[i][0]-a[i][1]]+a[i][0]*b[i][0]+a[i][1]*b[i][1]);
                if (j-a[i][0]-a[i][2]>=0)
                    f[j]=max(f[j],f[j-a[i][0]-a[i][2]]+a[i][0]*b[i][0]+a[i][2]*b[i][2]);
                if (j-a[i][0]-a[i][1]-a[i][2]>=0)
                    f[j]=max(f[j],f[j-a[i][0]-a[i][1]-a[i][2]]+a[i][0]*b[i][0]+a[i][2]*b[i][2]+a[i][1]*b[i][1]);
            }
        }
    cout<<f[n];
}

by 冷矿泉水 @ 2019-11-09 15:49:09

不是一维的错,是码的错。然而蒟蒻的我看不出来


|