阅读程序
二.
#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
这就是大概得求法,可以去看全排列_百度百科
然后看看样例