3.21学习总结Java
类和对象
类和对象是什么
类:是对象共同特征的描述(设计图);
对象:是真实存在的具体东西。
在Java中,必须先设计类,才能获取对象;
如何得到对象
创造对象:类名 对象名=new 类名();
如何使用对象
访问属性:对象名.成员变量
访问行为:对象名.方法名(...)
定义类的补充注意事项
用来描述一类事物的类,专业叫做:Javabean类。
在javabean类中,是不写main方法的。
编写main方法的类,叫做测试类。
我们可以在测试类中创建JavaBean类的对象并进行赋值调用。
对象成员变量的默认值规则
整数默认初始化为0。
小数默认初始化为0.0。
boolean类型默认初始化为false。
引用类型默认初始化为null。
封装
对象代表什么,就得封装对应的数据,并提供数据对应的行为。
封装能告诉我们,如何正确设计对象的属性和方法。
让编程变得更简单,降低我们的学习成本。
private关键字
就近原则和this关键字
当成员变量和局部变量命名相同时,当前对象的引用遵循就近原则,即谁离我近就用谁。
this能区分成员变量和局部变量,可以通过this来访问当前对象的成员变量。
this的本质:代表方法调用者的地址值
构造方法
如果我们自己没有写任何的构造方法,那么虚拟机会给我们加一个空参构造方法。
如果定义了一个构造方法,系统将不再提供默认的构造方法。
创造对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化。
快捷键alt+insert生成javabeen
成员变量和局部变量的区别
next();接收字符串
遇到空格,制表符,回车就停止接受,这些符号之和的数据就不会再接受了。
nextLine();接收字符串
可以接收空格,制表符,遇到回车才停止接受数据
API和API帮助文档
API:应用程序编程接口
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
API帮助文档:帮助开发人员更好的使用和查询API的一个工具
写了几道题
观察可以得到,从n爬到n+1有一种方法,从一爬到n+2有一种方法,对于n+3及更大的数,爬到他们的方法数,等于与他相邻的两个比他小点的方法数之和。代码如下:
#include <stdio.h>
int a[1005][1005];
int n, m,length=1;
void yyc(int s)
{
for (int i = 1; i <= length; i++) {
a[s][i] = a[s - 1][i] + a[s - 2][i];
}
for (int i = 1; i <= length; i++) {
if (a[s][i] > 9) {
a[s][i+1] += a[s][i] / 10;
a[s][i] %= 10;
if (a[s][length+1]) {
length++;
}
}
}
}
int main()
{
scanf("%d %d", &n, &m);
a[n + 1][1] = 1;
a[n + 2][1] = 2;
for (int i = n + 3; i <= m; i++) {
yyc(i);
}
for (int i = length; i >= 1; i--) {
printf("%d", a[m][i]);
}
return 0;
}
刚开始我的想法是,对于每道菜都有吃与不吃两种情况,吃的话就花费这道菜的价钱,看下一道菜,不吃的话就直接看下一道菜,若花费金额等于m,方案数+1,则返回上一次的选择,若金额大于m或菜品看完了钱还没花完,则直接回到上一次的选择。代码如下
#include <stdio.h>
int n, m,num=0;
int a[105];
void yyc(int k, int s)
{
if (s == m) {
num++;
return;
}
if (s > m||k==n+1) {
return;
}
yyc(k + 1, s + a[k]);
yyc(k + 1, s);
return;
}
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
yyc(1, 0);
printf("%d", num);
}
结果不是很理想,时间超限了
后面看了题解,使用动态规划
定义f[i][j]为用前i道菜用光j元钱的办法总数,其状态转移方程如下:
(1)if(j==第i道菜的价格)f[i][j]=f[i-1][j]+1;
(2)if(j>第i道菜的价格) f[i][j]=f[i-1][j]+f[i-1][j-第i道菜的价格];
(3)if(j<第i道菜的价格) f[i][j]=f[i-1][j];
说的简单一些,这三个方程,每一个都是在吃与不吃之间抉择。若钱充足,办法总数就等于吃这道菜的办法数与不吃这道菜的办法数之和;若不充足,办法总数就只能承袭吃前i-1道菜的办法总数。依次递推,在最后,我们只要输出f[n][m]的值即可。
代码如下:
#include <stdio.h>
int n, m;
int a[105],f[105][10005];
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i] > j) {
f[i][j] = f[i - 1][j];
}
if (a[i] < j) {
f[i][j] = f[i - 1][j] + f[i - 1][j - a[i]];
}
if (a[i] == j) {
f[i][j] = f[i - 1][j] + 1;
}
}
}
printf("%d", f[n][m]);
}