为什么多重背包一起处理会WA最后一个测试点,一个个处理就全AC了
  • 板块P1833 樱花
  • 楼主Lycorisjzy
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/29 20:23
  • 上次更新2023/11/3 07:00:35
查看原帖
为什么多重背包一起处理会WA最后一个测试点,一个个处理就全AC了
932956
Lycorisjzy楼主2023/7/29 20:23

如题,以下是最后一起处理多重背包的代码,ac前9个测试点,wa最后一个

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
#define MAXN 10010

int t, h1, h2, m1, m2, m, w[MAXN], v[MAXN], idx;
long long dp[1010];

int main(){
    scanf("%d:%d %d:%d %d", &h1, &m1, &h2, &m2, &m);
    t = ( h2 - h1 )*60 + m2 - m1;
    for( int i = 0 ; i < m ; i ++ ){
        int c = 1 , ww, vv, n;
        cin >> ww >> vv >> n;
        if( !n ) 
            for( int j = ww ; j <= t ; j ++ )   dp[j] = max( dp[j] , dp[j - ww] + vv);
        else if( n == 1 )
            for( int j = t ; j >= ww ; j -- )   dp[j] = max( dp[j] , dp[j - ww] + vv);
        else{
            //idx = 0;
            while( n > c ){
                n -= c;
                w[ ++ idx ] = c * ww;
                v[ idx ] = c * vv; 
                c *= 2;
            }
            w[ ++ idx ] = n * ww;
            v[ idx ] = n * vv;     
            // for( int i = 1 ; i <= idx ; i ++ ){
            //     for( int j = t ; j >= w[i] ; j -- ){
            //         dp[j] = max( dp[j] , dp[j - w[i]] + v[i] );
            //     }
            // }
        }     
    }
    for( int i = 1 ; i <= idx ; i ++ ){
                for( int j = t ; j >= w[i] ; j -- ){
                    dp[j] = max( dp[j] , dp[j - w[i]] + v[i] );
                }
            }
    cout << dp[t] << endl;
}

以下是我对每个多重背包处理的代码,全部ac

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
#define MAXN 10010

int t, h1, h2, m1, m2, m, w[MAXN], v[MAXN], idx;
long long dp[1010];

int main(){
    scanf("%d:%d %d:%d %d", &h1, &m1, &h2, &m2, &m);
    t = ( h2 - h1 )*60 + m2 - m1;
    for( int i = 0 ; i < m ; i ++ ){
        int c = 1 , ww, vv, n;
        cin >> ww >> vv >> n;
        if( !n ) 
            for( int j = ww ; j <= t ; j ++ )   dp[j] = max( dp[j] , dp[j - ww] + vv);
        else if( n == 1 )
            for( int j = t ; j >= ww ; j -- )   dp[j] = max( dp[j] , dp[j - ww] + vv);
        else{
            idx = 0;
            while( n > c ){
                n -= c;
                w[ ++ idx ] = c * ww;
                v[ idx ] = c * vv; 
                c *= 2;
            }
            w[ ++ idx ] = n * ww;
            v[ idx ] = n * vv;     
            for( int i = 1 ; i <= idx ; i ++ ){
                for( int j = t ; j >= w[i] ; j -- ){
                    dp[j] = max( dp[j] , dp[j - w[i]] + v[i] );
                }
            }
        }     
    }
    cout << dp[t] << endl;
}
2023/7/29 20:23
加载中...