题目
题解
01背包的加强版,由于两端可以放置 length/2 长度的木棍,所以加一维长度为3的状态,分别表示两端不放木棍,只有一端放木棍,两端都放木棍。
代码
#include <algorithm>
#include <bitset>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <climits>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
const int MAX= 1005;
const int MAXN = 4005;
int len[MAX];
long long value[MAX];
long long dp[MAXN][3];
int main(){
int T;
cin >> T;
for(int t=1;t<=T;++t){
memset(dp,0,sizeof(dp));
int n,l;
cin >> n >> l;
l *= 2;
long long mx = 0;
for (int i = 0; i < n; ++i) {
scanf("%d %lld",len + i, value + i);
len[i] *= 2;
mx = max(mx, value[i]);
}
for (int i = 0; i < n; ++i){
for (int j = l; j >= len[i]/2; --j) {
for(int k=0;k<3;++k){
if(j >= len[i])
dp[j][k] = max(dp[j][k], dp[j - len[i]][k] + value[i]);
if(k > 0)
dp[j][k] = max(dp[j][k], dp[j - len[i] / 2][k-1] + value[i]);
mx = max(mx, dp[j][k]);
}
}
}
cout << "Case #" << t << ": " << mx << endl;
}
return 0;
}