We need know.
整数类型最大值:
short : 32766;
int : 2147483646;
lower_bound: 找出指向满足ai >= k 的 ai 的最小的指针;求最长单调递增序列;
upper_bound: 找出指向满足ai > k 的 ai 的最小的指针;求最长单调不递减序列;
upper_bound(a, a+n, k) - lower_bound(a, a+n, k) , 有序数组a中的k的个数;
lower_bound用法:
int it1 = lower_bound(a, a+n, k) - ans;it1 表示 下标;
int *it2 = lower_bound(a, a+n, k); *it2 表示 数组;
it1 = it2 - ans;
01背包问题:
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++){
for(int j = v; j >= a[i].v; j--){
dp[j] = max(dp[j], dp[j-a[i].v] + a[i].w);
}
}
又见01背包问题(枚举价值求同等价值需要的最小体积):
memset(dp, 0, sizeof(dp));
dp[0] = 0;
for(int i = 0; i < n; i++){
for(int j = Sum_w; j >= a[i].w; j--){
dp[j] = min(dp[j]. dp[j-a[i].w] + a[i].v);
}
}
for(int i = 0; i <= Sum_w; i++){
if(dp[i] <= v){
ans = i;
}
}
完全背包问题:
//memset(dp, -INF, sizeof(dp));dp[0] = 0;//完全装下不留空间;//if(dp[v]) < 0)puts("-1");
//memset(dp, 0, sizeof(dp));只求可装最大价值;
for(int i = 0; i < n; i++){
for(int j = a[i].v; j <= v; j++){
dp[j] = max(dp[j], dp[j-a[i].v] + a[i].w);
}
}