1.今天大概的复习了一下二分查找和背包dp
————先说说二分查找
在写二分查找是首先要注意的是循环的条件和查找的方向相对应。
当时使用循环条件为while(left<=right)时用的是左闭右闭查找时都要将mid给去掉
int search(int nums[], int size, int target) //nums是数组,size是数组的大小,target是需要查找的值
{
int left = 0;
int right = size - 1; // 定义了target在左闭右闭的区间内,[left, right]
while (left <= right) { //当left == right时,区间[left, right]仍然有效
int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
if (nums[middle] > target) {
right = middle - 1; //target在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; //target在右区间,所以[middle + 1, right]
} else { //既不在左边,也不在右边,那就是找到答案了
return middle;
}
}
//没有找到目标值
return -1;
}
以上是使用左闭右闭
int search(int nums[], int size, int target)
{
int left = 0;
int right = size; //定义target在左闭右开的区间里,即[left, right)
while (left < right) { //因为left = right的时候,在[left, right)区间上无意义
int middle = left + ((right - left) / 2);
if (nums[middle] > target) {
right = middle; //target 在左区间,在[left, middle)中
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
// 没找到就返回-1
return -1;
}
注意当middle>targe时 right=middle
——— 再来说背包dp相关内容
1.第一种是01背包--就是每种物品只能选一次
注意当物品的代价应当反向循环
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i])
2.完全背包--就是每种物品能够选无限次
与01背包区别于第二行
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+v[i])
3. 多重背包--每种物品有一定数量限制
可以将数拆分成多个数
例如:7的二进制为111,则可以用1,2,4表达。再例如10则可先拆分为7和3,再拆分为1,2,4,3.