2023大湾区错题解析

阅读程序

二.

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int w[35000],d[35000],dp[35000];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&w[i],&d[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=w[i];j--)
		{
			dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
		}
	}
	printf("%d\n",dp[m]);
	return 0;
}

:L 提高组的做多了看这个简直就是兄弟你好香啊

来看看解析:

首先这一看就是动规,背包问题 (看变量名

没什么好解释的吧(那我怎么还会错),主要的就是第二个循环里的东西和它的循环本身

首先就是逆序从m遍历到w[i]

然后判断每个物品i是否放入背包里,即循环中的max函数

后得出dp[m]就是背包所能装的最大值

看看错题

eeeee

这题,如果把变量改成w[i]到m时,前面的dp[j-w[i]]+d[i]可能已经被更新过了,导致当前的dp[j]不再是原来的值

所以选B

(怎么错的? 当然是蒙的啊)

来看看程序:

首先定了一个a数组,输入,然后用了一个二重循环

这个二重循环长得很眼熟对吧🤔

这么看有点像冒泡排序

可是仔细看,他不是相邻的两个数交换,而是先用一个for循环从a[i]到a[n]找最小值,把最小值的下标记在tmp中,然后再去交换a[i]与a[tmp]的值,这样一来数组就会从小到大排序了

这么说,不是冒泡排序了,那就是...选择排序!

如图,然后程序就输出,结束程序

来看看题:

eee....

这题其实也就是简单的模拟,只需要把第一行输入去掉,然后拿剩下输入的数组去模拟一下就好了(你猜我怎么错的)

完善程序

一.

(下一个全排列)输入一个正整数n(2<=n<=106), 以及一个长度为n 的排列,规定 (1,2,3,4,…,n) 是第1个排列,(n,n-1,…,1) 是最后一个排列。根据这n 个数组成的排列,输出下一个排列,每一个数后输出一个空格;若这n 个数已经 是最后一个排列,输出"No NextPermutation"。

输入:

 5

1 2 5 4 3

输出

1 3 2 4 5

首先看看题,一个关于全排列的题目

不是,什么是全排列?

往简单来说全排列就是一个序列所有的排序可能性

比如1,2,3的全排列就是

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

有6个全排列,有n个元素的序列全排列,得到的排列数量是 n! 

然后就是关于全排列的计算:

拿题 或 1,2,3来说,这样排列:

拿第一个数就是1

然后对2和3进行排列 有2,3和3,2

得1,2,3和1,3,2

然后再拿第二个数就是2

对剩下的1和3进行排列,得13和31

得2 1 3和2 3 1

然后取3,拿剩下的1 2排列,得1 2和2 1

得3 1 2和,3 2 1

这就是大概得求法,可以去看全排列_百度百科
然后看看样例

二.

  • 39
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值