30,229
社区成员




代码:
//力扣提交形式
int search(int* nums, int numsSize, int target){//1 2 9 10 11 66 88 99 100//99
int left = 0, right =numsSize-1, mid;
while (left <= right) {//0 9 //1 9
mid = (left + right) / 2;//4
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
解析:二分法就是以中间值为基准,缩小查找范围,前提条件是排好序的数据,效率更高!
小明有一个容量为 V 的背包。
这天他去商场购物,商场一共有 N 种物品,第 ii 种物品的体积为 w_iwi,价值为 v_ivi,数量为 s_isi。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。
输入第 1 行包含两个正整数 N,V,,表示商场物品的数量和小明的背包容量。
第 2\sim N+12∼N+1 行包含 33 个正整数 w,v,sw,v,s,表示物品的体积和价值。
1\leq N\leq10^21≤N≤102,1\leq V \leq 2\times10^21≤V≤2×102,1 \leq w_i,v_i,s_i \leq 2\times10^21≤wi,vi,si≤2×102。
输出一行整数表示小明所能获得的最大价值。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int dp[101][101] = {0};
int main() {
int n, V;
cin >> n >> V;
int w[200] = {0}, v[200] = {0}, s[200] = {0};
for (int i = 1; i <= n; i++)
cin >> w[i] >> v[i] >> s[i];
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= V; j++) {
for (int k = 0; k <= s[i] && k * w[i] <= j; k++) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - k * w[i]] + k * v[i]);
}
}
}
cout << dp[n][V];
}
解析:最背包问题的基础上增加了变量s,也就是数量!!!
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
给定数列 1, 1, 1, 3, 5, 9, 17,⋯,从第 4项开始,每项都是前 3 项的和。
求第 20190324 项的最后 4 位数字。
#include<stdio.h>
int main() {
int f1=1,f2=1,f3=1,f4;
int i;
for (i = 4; i <=20190324; i++) {
f4=(f1+f2+f3)%10000;//求后四位
f1=f2;
f2=f3;
f3=f4;
}
printf("%d",f4);//20190324项正好满足就是对f4;
return 0;
}
总结:播下一种心态,收获一种理想!