黄梅时节家家雨 , 青草池塘处处 WA
帮帮蒟蒻吧
源代码 :
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#define INF 0x7fffffff
#define int long long
#define re register
#define in inline
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std ;
const int N = 10005 ;
int n , m , C ;
int v[N] , w[N] , d[N] ;
int a[N] , b[N] , c[N] ;
int dp[N] ;
int ans ;
in int read ( ) {// 快读
re int x = 0 , l = 1 ;
re char c = getchar( ) ;
if(!isdigit(c)) {
if(c == '-') {
l = -1 ;
c = getchar( ) ;
}
}
while(isdigit(c)) {
x = x * 10 + c - '0' ;
c = getchar( ) ;
}
return x * l ;
}
in void write(int x) {// 快写
if(x < 0) {
putchar('-') ;
x = -x ;
}
if(x > 9) write(x / 10) ;
putchar(x % 10 + '0') ;
}
in int MAX(int a , int b) {
if(a > b) {
return a ;
} else {
return b ;
}
}
in void Zero_one_Pack(int w , int v , int C) {// 01背包
for(re int i = C ; i >= w ; i --) {
dp[i] = MAX(dp[i] , dp[i - w] + v) ;
}
}
in void Complete_Pack(int w , int v , int C) {// 完全背包
for(re int i = w ; i <= C ; i ++) {
dp[i] = MAX(dp[i] , dp[i - w] + v) ;
}
}
void Multiple_Pack(int w , int v , int num , int C) { // 多重背包
if(w * num >= C) {
Complete_Pack(w , v , C) ;
return ;
} else {
re int cnt = 1 ;
while(cnt <= num) {
Zero_one_Pack(cnt * w , cnt * v , C) ;
num -= cnt ;
cnt *= 2 ;
}
Zero_one_Pack(num * w , num * v , C) ;
}
}
signed main (void) {
n = read( ) ;
m = read( ) ;
C = read( ) ;
for(re int i = 1 ; i <= n ; i ++) {
v[i] = read( ) ;
w[i] = read( ) ;
d[i] = read( ) ;
Multiple_Pack(v[i] , w[i] , d[i] , C) ;
}
for(re int i = 1 ; i <= m ; i ++) {
a[i] = read( ) ;
b[i] = read( ) ;
c[i] = read( ) ;
for(re int j = C ; j >= 0 ; j --) {
for(re int k = 0 ; k <= j ; k ++) {
dp[k] = MAX(dp[j] , dp[j - k] + a[i] * k * k + b[i] * k + c[i]) ;
}
}
}
write(dp[C]) ;
putchar('\n') ;
return 0;
}