如题,以下是最后一起处理多重背包的代码,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;
}