玄关求条

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

SpringNeverDie @ 2024-12-11 22:02:26

#include<bits/stdc++.h>
using namespace std;

int n,m,ap[61][32010],v[61],p[61],q[61];
vector<int> mas[61];

int main(){
    cin >> n >> m;

    int w[61];
    for(int i=1;i<=m;i++){
        cin >> v[i] >> p[i] >> w[i];
        q[i]=v[i]*p[i];
        if(w[i]) mas[w[i]].push_back(i);
    }

    for(int i=1;i<=m;i++){
        for(int j=10;j<=n;j+=10){
            ap[i][j]=max(ap[i-1][j],ap[i][j]);
            if(w[i]) continue;

            int y=ap[i][j];
            switch(mas[i].size()){
                case 0:
                    if(j-v[i]>=0) y=max(y,ap[i-1][j-v[i]]+q[i]);
                    break;  
                case 1:
                    if(j-v[i]>=0) y=max(y,ap[i-1][j-v[i]]+q[i]);
                    if(j-v[i]-v[mas[i][0]]>=0 && i>=2) y=max(y,ap[i-2][j-v[i]-v[mas[i][0]]]+q[i]+q[mas[i][0]]);
                    break;
                case 2:
                    if(j-v[i]>=0) y=max(y,ap[i-1][j-v[i]]+q[i]);

                    if(j-v[i]-v[mas[i][0]]>=0 && i>=2){
                        y=max(y,ap[i-2][j-v[i]-v[mas[i][0]]]+q[i]+q[mas[i][0]]);
                    }

                    if(j-v[i]-v[mas[i][1]]>=0 && i>=2){
                        y=max(y,ap[i-2][j-v[i]-v[mas[i][1]]]+q[i]+q[mas[i][1]]);
                    }

                    if(j-v[i]-v[mas[i][0]]-v[mas[i][1]]>=0 && i>=3){
                        y=max(y,ap[i-3][j-v[i]-v[mas[i][0]]-v[mas[i][1]]]+q[i]+q[mas[i][0]]+q[mas[i][1]]);
                    }
                    break;
            }       
            ap[i][j]=max(ap[i][j],y);
        }
    }

//  cout << "\t"; 
//  for(int j=200;j<=2000;j+=100) cout << j << "\t";
//  cout  << endl;
//  for(int i=1;i<=10;i++){
//      cout << i << ":\t";
//      for(int j=200;j<=2000;j+=100){
//          cout << ap[i][j] << "\t";
//      }
//      cout << endl;
//      }

    cout << ap[m][n] <<endl;    

    /* 
    8000 20
    100 3 0
    400 5 0
    300 5 0
    1400 2 2
    500 2 2
    800 2 3
    1400 5 0
    300 5 0
    1400 3 0
    500 2 0
    1800 4 0
    440 5 10
    1340 5 10
    1430 3 0
    500 2 0
    800 2 0
    1400 5 0
    300 4 0
    400 3 0
    500 3 18

    36400
    */
}

实在看不出来什么问题


|