本蒟蒻敲了一 亿 小时 , 结果却是42 , 求 DALAO 帮调
小破源码 :
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#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 ;
int W , n ;
int v[105] , w[105] , m[105] ;
int dp[40005] ;
void Complete_Pack(int v , int w) {// 完全背包
for(re int i = 1 ; i <= W ; i ++) {
dp[i] = max(dp[i] , dp[i - w] + v) ;
}
}
void Zero_one_Pack(int v , int w) {// 01背包
for(re int i = W ; i >= 1 ; i --) {
dp[i] = max(dp[i] , dp[i - w] + v) ;
}
}
void Multiple_Pack(int v , int w , int num) { // 多重背包
if(v * num >= W) {
Complete_Pack(v , w) ;
return ;
// cout << "1\n";
} else {
re int cnt = 1 ;
while(cnt < num) {
Zero_one_Pack(cnt * v , cnt * w) ;
num -= cnt ;
cnt *= 2 ;
}
// cout << "2\n";
Zero_one_Pack(cnt * v , cnt * w) ;
}
}
signed main ( ) {
ios ;
cin >> n >> W ;
for(re int i = 1 ; i <= n ; i ++) {
cin >> v[i] >> w[i] >> m[i] ;
}
for(re int i = 1 ; i <= n ; i ++) {
// cout << "3\n";
Multiple_Pack(v[i] , w[i] , m[i]) ;
}
cout << dp[n] << '\n' ;
return 0;
}