状压DP拿下01背包(
2024-11-10 12:19:46
发布于:广东
分别表示第 种状态的重量、最大价值
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
int a[30], b[30];
int dp[2][33554432];
signed main(){
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> a[i] >> b[i];
}
for(int i = 0; i < (1 << n); i++){
for(int j = 0; j < n; j++){
if((i & (1 << j)) && dp[0][i ^ (1 << j)] + a[j] <= m && dp[1][i ^ (1 << j)] + b[j] > dp[1][i]){
dp[0][i] = dp[0][i ^ (1 << j)] + a[j];
dp[1][i] = dp[1][i ^ (1 << j)] + b[j];
}
}
}
int mx = 0, idx = 0;
for(int i = 0; i < (1 << n); i++){
mx = max(mx, dp[1][i]);
}
cout << mx;
return 0;
}
什么?你问这个方法有什么优点?
好吧确实没有 时间复杂度 ,空间复杂度 都不如深搜(
全部评论 2
。。。。又是DP
3天前 来自 河北
0线性DP弄得我想死
但状压DP就简单了(虽然难度标得一般比线性DP高3天前 来自 广东
0因为它特征明显(),而且只需要暴力枚举每一个状态就行了
3天前 来自 广东
0so?
3天前 来自 河北
0
顶
4天前 来自 广东
0
有帮助,赞一个