提示:这里为每天自己的学习内容心情总结;
Learn By Doing,Now or Never,Writing is organized thinking.
提示:以下是本篇文章正文内容
**「完全背包问题」 ** 是指,有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。
/**
* 完全背包问题,物品可以重复使用
* - 由于可以重复使用,所以每次都可以从第一个物品开始判断
*/
public static int testCompletePack(int[] weight, int[] value, int bagSize) {
int[] dp = new int[bagSize + 1];
for (int i = bagSize; i >= weight[0]; i--) {
dp[i] = value[0];
}
for (int i = 0; i < weight.length; i++) {
for (int j = weight[i]; j <= bagSize; j++) {
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
return dp[bagSize];
}
public int findTargetSumWays(int[] nums, int target) {
/**
* - 首先求出整个数组中的所有元素之和sum
* - 可以看成将整个数组分为两部分,A和B,那么满足下面的数学关系式:
* A+B=sum,A-B=target
* 那么我们只需要求出采用数组中的元素拼凑出来和为 (sum+target)/2的方法有多少
* - QQQ:如何看成是一个背包问题呢?
* - - 物品重量和价值数组都是nums,背包的所能背的容量为sum+target)/2,dp【i】代表背包价值为i时的方法数
*/
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
if (target < 0 && sum < -target) return 0;
if ((sum + target) % 2 != 0) {
return 0;
}
sum = (sum + target) / 2;
if (sum < 0) {
sum = -sum;
}
int[] dp = new int[sum + 1];
dp[0] = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = sum; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
return dp[sum];
}
public int findMaxForm(String[] strs, int m, int n) {
/**
* - 动态规划的背包问题,选和不选对结果的影响,dp数组含义是什么呢?
* - 这个子集中最多能有m个0和n个1
* - dp[i][j],代表子集中最多有i个0和j个1时的最大子集的长度
*/
int[][] dp = new int[m + 1][n + 1];
for (int index = 0; index < strs.length; index++) {
int[] countZeroAndOne = countZeroAndOne(strs[index]);
int zero = countZeroAndOne[0];
int one = countZeroAndOne[1];
// 遍历dp数组
for (int i = m; i >= zero; i--) {
for (int j = n; j >= one; j--) {
dp[i][j] = Math.max(dp[i][j], dp[i - zero][j - one] + 1);
}
}
}
return dp[m][n];
}
/**
* 写一个函数,计算出来字符串的0和1的个数
*/
private int[] countZeroAndOne(String s) {
int[] res = new int[2];
int zero = 0;
int one = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
zero++;
} else {
one++;
}
}
res[0] = zero;
res[1] = one;
return res;
}
public int change(int amount, int[] coins) {
/**
* - 凑硬币的个数,完全背包问题
* - dp[i]代表凑出总金额为i的硬币组合数
*/
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int i = 0; i < coins.length; i++) {
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
参考的是牛客网 华为机试 的内容,进行代码实现的。
对于传统ACM的OJ模式题目,你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果。
ACM(OJ)模式下对于各种输入输出情况的总结(JAVA);
注意类名必须为Main, 不要有任何package xxx信息
首先对与Java的输入,要用[ Scanner ]:
Scanner in = new Scanner(System.in);
读取字符或行:
in.hasNext(); // 字符
in.hasNextLine(); // 行
采用has xxxx的话,后面也要用next xxxx。比如前面用hasNextLine,那么后面要用 nextLine 来处理输入。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String s =in.nextLine();
String[] arr = s.split(" ");
System.out.println(arr[arr.length - 1].length());
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
String s2 = in.nextLine();
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int res = 0;
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) == s2.toCharArray()[0]) {
res++;
}
}
System.out.println(res);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int length = in.nextInt();
// 注意 hasNext 和 hasNextLine 的区别
TreeSet<Integer> set = new TreeSet();
for (int i = 0; i < length; i++) { // 注意 while 处理多个 case
int a = in.nextInt();
set.add(a);
}
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
sb.append(s);
int length = sb.length();
int addZero = 8 - length % 8;
while (addZero > 0 && addZero < 8) {
sb.append('0');
addZero--;
}
String string = sb.toString();
while (string.length() > 0) {
System.out.println(string.substring(0, 8));
string = string.substring(8);
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String line = in.nextLine();
int ans = 0;
int length = line.length();
// 从右到左
for (int i = length - 1; i >= 0; i--) {
char c = line.charAt(i);
int b = 0;
if (c == 'x' || c == 'X') {
System.out.println(ans);
break;
} else if (c >= 'A' && c <= 'F') {
b = c - 'A' + 10;
} else {
b = c - '0';
}
ans += (int) Math.pow(16, length - i - 1) * b;
}
}
}
该部分的内容是参考牛客网的 SQL进阶挑战,总共含有 6
部分的内容如下所示,
「增删改操作」部分如下
INSERT INTO exam_record (uid, exam_id, start_time, submit_time, score) VALUES
(1001, 9001, '2021-09-01 22:11:12', '2021-09-01 23:01:12', 90),
(1002, 9002, '2021-09-04 07:01:02', NULL, NULL);
INSERT INTO exam_record_before_2021(uid, exam_id, start_time, submit_time, score)
SELECT uid, exam_id, start_time, submit_time, score
FROM exam_record
WHERE YEAR(submit_time) < '2021';
DELETE FROM examination_info
WHERE exam_id=9003;
INSERT INTO examination_info
VALUES(NULL,9003, 'SQL','hard', 90, '2021-01-01 00:00:00')
update examination_info
set tag = 'Python' where tag = 'PYTHON';
UPDATE exam_record
SET submit_time='2099-01-01 00:00:00', score=0
WHERE start_time < '2021-09-01 00:00:00' AND score IS NULL;
提示:这里对文章进行总结: