40分,其他tle 目前再想有什么方法可以优化,希望有大佬指点谢谢

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

Mamba_ever_out @ 2020-02-09 11:29:54

#include<bits/stdc++.h>
using namespace std;
int a[71][33001];
int b[71]; 
int v[71];
int p[71];
int wz[71][71];
int gs[71];
int dp[33001];
int main(){
    int n,m;
    cin>>n>>m;
    int num = 1;
    for(int i=1;i<=m;i++){ 
        int q;
        scanf("%d%d%d",&v[i],&p[i],&q);
        if(q==0){    
         b[num] = i; 
         num++;  
        }
        else{ 
            wz[q][gs[q]+1] = i;  
            gs[q] ++;
        }
    }
    num -- ; 
     for(int i=1;i<=num;i++){       
        for(int j=n-v[b[i]];j>=1;j--){       
            for(int k=1;k<=gs[b[i]];k++){   
                if(j-v[wz[b[i]][k]]>=0)
                    dp[j] = max(dp[j],dp[j-v[wz[b[i]][k]]]+p[wz[b[i]][k]]*v[wz[b[i]][k]]); 
                else 
                    ;
             }
         } 
        for(int j=0;j<=n-v[b[i]];j++){          
         a[i][j+v[b[i]]] = dp[j] + p[b[i]]*v[b[i]]; 
         dp[j]=0;                                       
        }
     }
    for(int i = 1;i<=num;i++){  
        for(int k=n;k>=1;k--){      
            for(int m=n;m>=1;m--){       
                if(k-m>=0)
                    dp[k] = max(dp[k],dp[k-m]+a[i][m]);
                else
                    ; 
            }
        } 
    }
    cout<<dp[n];
     return 0;
}

by tangrunxi @ 2020-02-09 11:33:10

int a[71][33001];

你不觉得要开 long long 吗


by tangrunxi @ 2020-02-09 11:33:16

@zhangthreewind


by Mamba_ever_out @ 2020-02-09 11:37:34

@tangrunxi 可是他说输出小于200000


by tangrunxi @ 2020-02-09 11:39:35

@zhangthreewind 输出的是这个

 cout<<dp[n];

我说a数组开小了。


by Mamba_ever_out @ 2020-02-09 11:43:45

@tangrunxi 我的a[i][j]表示的是第i组物品(每组就是一个主产品和各种附属产品在j个金钱的情况下能获得的最高价值)数量为60 金钱最多为32000,应该不会超的啊


by Mamba_ever_out @ 2020-02-09 13:31:23

上面01背包位置写反现在改正为

for(int k=1;k<=gs[b[i]];k++){    //里面就相当于看成 01背包 ,在这其中已经算(默认已经算进主产品) 
            for(int j=n-v[b[i]];j>=1;j--){  // 购买了主产品,所以对金币计算会有所改动 
                if(j-v[wz[b[i]][k]]>=0)
                    dp[j] = max(dp[j],dp[j-v[wz[b[i]][k]]]+p[wz[b[i]][k]]*v[wz[b[i]][k]]); 
             }
         } 

|