OI模版合集
快读快写
inline int read() {//快读
char ch = getchar();
int x = 0,f = 1;
while (!isdigit(ch)) if (ch == '-') f = -1,ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0',ch = getchar();
return x * f;
}
inline void print(int n){//快写
if(n < 0){
putchar('-');
n *= -1;
}
if(n > 9) print(n / 10);
putchar(n % 10 + '0');
}
背包
01背包
二维写法
cin >> maxw >> n;
for (int i = 1;i <= n;i++) {
cin >> w >> v;
for (int j = 1;j <= maxw;j++) {
if (w > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - w] + v);
}
}
}
cout << dp[n][maxw];
一维写法
cin >> maxv >> n; // maxv: 价值
for (int i = 1;i <= n;i++) {
cin >> v;
for (int j = maxv;j >= v;j--) {
dp[j] = max(dp[j],dp[j - v] + v);
}
}
cout << dp[maxv];
完全背包
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10,S=1e7+10;
ll dp[S],vi,wi,maxw,n;
int main() {
scanf("%lld%lld", &maxw, &n);
for (int i=1;i<=n;i++) {
scanf("%lld%lld",&wi,&vi);
for (int j = wi;j<=maxw;j++)
dp[j] = max(dp[j],dp[j-wi]+vi);
}
printf("%lld", dp[maxw]);
return 0;
}
二分
找最大
int Binary_Search(int Left, int Right) {
while(Left <= Right) {
int Mid = (Left + Right) / 2;
if(check(Mid))
Left = Mid + 1;
else
Right = Mid - 1;
}
return Left - 1;
}
找最小
int Binary_Search(int Left, int Right) {
while(Left <= Right) {
int Mid = (Left + Right) / 2;
if(check(Mid))
Right = Mid - 1;
else
Left = Mid + 1;
}
return Right + 1;
}

浙公网安备 33010602011771号