1.20今日总结

上午复习了背包问题。

01背包问题

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

  4 5
  1 2
  2 4
  3 4
  4 5

8

背包问题,将每个物品分成取或者不取的情况,然后判断取或不取那个比较大,然后取了那个物品,就把空间减去那个物品的空间,价值加上那个物品的价值。

核心代码:

	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)   
          {
	        f[j]=max(f[j],f[j-v[i]]+w[i]); 
			}
	}

v[i]为第i件物品的体积,w[i]为价格。

代码实现:

#include<stdio.h>
const	int N=1000;
	int n,m;
	int v[N],w[N];
	int f[N];
	int max(int a,int b)
{
	int z;
	z=a>b?a:b;
	return (z); 
 } 
int main()
{
	int max(int a,int b);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	scanf("%d %d",&v[i],&w[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)   
            {
	        f[j]=max(f[j],f[j-v[i]]+w[i]); 
			}
	}
	printf("%d",f[m]);
}

完全背包

与01背包不同的是完全背包中的物品可以多次选择,而01背包中的物品只能选择一次。

两者代码的区别在这:

核心代码:

	for(int i=0;i<n;i++)
	{
		for(int j=v[i];j<=m;j++)  //背包与完全背包的区别     
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);       
		}
	}

 //背包与完全背包的区别

01背包                                   高->低  (每次选择选这件物品或者下一次选择这件物品,取决于那个更大) 
                                              //   f[5]=f[5] || f[4]+w[1];(取最大值)
                                              //   f[4]=f[4] || f[3]+w[1];
                                              //   f[3]=f[3] || f[2]+w[1];
                                              //   f[2]=f[2] || f[1]+w[1];
                                              //   f[1]=f[0]+w[1];
                                              //   f[5]=f[5] || f[3]+w[2];
                                              //   f[4]=f[4] || f[2]+w[2];
                                              //   f[3]=f[3] || f[1]+w[2];
                                              //   f[2]=f[2] || f[0]+w[2];

    完全背包                             低->高(每次选择都可能包含相同的物品)   
                                                // f[1]=f[0]+w[1];(取最大值)
                                                //f[2]=f[2] || f[1]+w[1];
                                                //f[3]=f[3] || f[2]+w[1];
                                                //f[4]=f[4] || f[3]+w[1];
                                                //f[5]=f[5] || f[4]+w[1];
                                                //f[2]=f[2] || f[0]+w[2];
                                                //f[3]=f[3] || f[1]+w[2];
                                                //f[4]=f[4] || f[2]+w[2];

代码实现:

#include<stdio.h>
int v[1000],w[1000];
int f[1000];
	int max(int a,int b)
{
	int z;
	z=a>b?a:b;
	return (z); 
 } 
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
	scanf("%d %d",&v[i],&w[i]);
	for(int i=0;i<n;i++)
	{
		for(int j=v[i];j<=m;j++)
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);       
		}
	}
	printf("%d",f[m]);
}

P1455 搭配购买

题目描述

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 nn 朵云,云朵已经被老板编号为 1,2,3,...,n1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入格式

第一行输入三个整数,n,m,wn,m,w,表示有 nn 朵云,mm 个搭配和你现有的钱的数目。

第二行至 n+1n+1 行,每行有两个整数, c_i,d_ici​,di​,表示第 ii 朵云的价钱和价值。

第 n+2n+2 至 n+1+mn+1+m 行 ,每行有两个整数 u_i,v_iui​,vi​。表示买第 u_iui​ 朵云就必须买第 v_ivi​ 朵云,同理,如果买第 v_ivi​ 朵就必须买第 u_iui​ 朵。

输出格式

一行,表示可以获得的最大价值。

输入输出样例

输入 #1复制

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

输出 #1复制

1

说明/提示

  • 对于 30\%30% 的数据,满足 1 \le n \le 1001≤n≤100;
  • 对于 50\%50% 的数据,满足 1 \le n,w \le 10^31≤n,w≤103,1 \le m \le 1001≤m≤100;
  • 对于 100\%100% 的数据,满足 1 \le n \le 10^41≤n≤104,0 \le m \le 5 \times 10^30≤m≤5×103。

这题采用01背包和并查集,因为这个老板规定,必须搭配购买,买a必须买b,买b必须买a,因此将a的根节点指向b的根节点,然后可以把价格价值全部加在b的根节点上。所以购买时只需购买根节点的物品。

bug:每次联合两个节点的时候,没有用一个参数来代表根节点,因此每次都会需要寻找根节点。

void link(int a,int b)
{
  if(find_root(a)!=find_root(b))
     father[find_root(a)]=find_root(b);
}

 还有一个bug:即数组开太小了,导致超出内存。

下午把代码改了改。

代码实现:

#include<bits/stdc++.h>
using namespace std;
int father[1000000];
int v[100001];//价钱 
int w[100001];//价值
int f[100001]; 
int find_root(int a)
{
	if(father[a]==a)
	return a;
	else{
		father[a]=find_root(father[a]);
		return father[a];
	}
}
void link(int x,int y)
{
	int a=find_root(x);
	int b=find_root(y);
	if(a!=b)
	{
		father[a]=b;
		v[b]+=v[a];//连多云相连,所以需要把总价钱 总价值放在根节点上 
		w[b]+=w[a];
	}
 } 
int main()
{
	int n,m,W;
	cin>>n>>m>>W;
	for(int i=1;i<=n;i++)
    {
	  father[i]=i;//父节点 
	  cin>>v[i]>>w[i];
}
    for(int i=1;i<=m;i++)
    {
    	int x,y;
    	cin>>x>>y;
    	link(x,y); 
	}
	for(int i=1;i<=n;i++)
	{
		if(father[i]==i)//找到一个根节点,然后进行背包
		{
			for(int j=W;j>=v[i];j--)
			   f[j]=max(f[j],f[j-v[i]]+w[i]); 
		} 
	}
	cout<<f[W];
 } 

 

P1305 新二叉树

题目描述

输入一串二叉树,输出其前序遍历。

输入格式

第一行为二叉树的节点数 nn。(1 \leq n \leq 261≤n≤26)

后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。

空节点用 * 表示

输出格式

二叉树的前序遍历。

输入输出样例

输入 #1复制

6
abc
bdi
cj*
d**
i**
j**

输出 #1复制

abdicj

代码实现:

#include<bits/stdc++.h>
using namespace std;
struct node{
	char l;//左儿子 
	char r;//右儿子 
};
struct node tree[1000];
void print(char x)
{
	cout<<x;//输出 
	if(tree[x].l!='*')//先向左遍历 
	print(tree[x].l);
	if(tree[x].r!='*')//再向右遍历 
	print(tree[x].r);
}
int main()
{
	int n;
	cin>>n;
     char r;
	for(int i=1;i<=n;i++)
	{
	char a;
    cin>>a;//输入一个字母表示根节点 
	if(i==1)
	 r=a;
	cin>>tree[a].l>>tree[a].r;//输入根节点的左右儿子 
}
    print(r);
    return 0;
}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ngxin1.20是一个开源的网络服务器软件,可以用于搭建高性能的Web服务。离线安装指的是在没有网络连接的情况下进行软件安装。 要离线安装ngxin1.20,首先需要获取ngxin1.20的安装包,可以通过在有网络的环境下下载ngxin1.20的安装包,并将其保存到本地的存储设备中,例如U盘或硬盘。 接下来,在目标机器上插入包含ngxin1.20安装包的存储设备。打开存储设备中的ngxin1.20安装包,将其解压到一个目录中。 然后,进入解压后的目录,找到并打开一个命令行终端,输入以下命令进行离线安装: ``` ./configure make make install ``` 首先,`./configure`命令会检查目标机器的环境,包括系统依赖和编译选项。如果有缺失的依赖,需要手动安装并重新执行`./configure`命令。 接下来,`make`命令会编译ngxin1.20的源代码,并生成可执行文件。 最后,`make install`命令将编译生成的文件安装到系统中的指定位置。可以根据需要修改安装路径,如果不修改,默认安装在`/usr/local/nginx`目录下。 完成以上步骤后,ngxin1.20就成功地离线安装到目标机器上了。 需要注意的是,由于没有网络连接,离线安装可能无法自动下载和安装ngxin1.20的依赖包。因此,在进行离线安装之前,需要提前确认目标机器上已安装了ngxin1.20所需的依赖包,如果有缺失的依赖,需要手动安装。 ### 回答2: Ngxin是一个开源的HTTP和反向代理服务器,非常适合用于高性能、负载均衡和容错的环境中。Ngxin的安装通常是在线完成,但在某些情况下,您可能需要进行离线安装。 要进行离线安装,您首先需要获取Ngxin的安装文件和其所需的依赖项。您可以从Ngxin官方网站上下载最新版本的Ngxin安装包,并在离线环境中传输到目标机器上。 在离线环境中安装Ngxin时,您需要先安装所需的依赖项。这些依赖项可能包括但不限于PCRE(Perl Compatible Regular Expressions)库和OpenSSL库。您可以从这些库的官方网站下载对应版本的安装包,并将其传输到离线环境中。 在安装Ngxin之前,您需要解压下载的Ngxin安装包,并将其放置在预先选择的安装目录中。然后,您需要修改安装目录下的配置文件,以根据您的需求设置Ngxin的参数和选项。 启动离线安装的Ngxin通常需要使用终端命令来执行。您可以打开终端,并导航至Ngxin安装目录。然后,您可以使用命令行工具来启动Ngxin,并指定配置文件的路径。 在Ngxin成功启动后,您可以在浏览器中访问Ngxin的默认端口(通常为80),以验证其是否正确运行。如果一切正常,您将能够看到Ngxin默认的欢迎页面。 总结来说,Ngxin的离线安装需要您下载安装包和依赖项并将其传输到目标机器中。然后,在终端中解压安装包、修改配置文件,并使用命令行工具来启动Ngxin。最后,您可以验证Ngxin的成功安装和运行。 ### 回答3: ngxin是一个高性能的HTTP和反向代理服务器,它的离线安装可以在没有网络连接的环境下进行安装。 首先,为了进行ngxin1.20的离线安装,您需要事先准备好ngxin的安装包。通常,ngxin的官方网站会提供各个版本的压缩包供用户下载。您可以在有网络连接的环境下下载所需版本的压缩包,并将其保存到离线的机器上。 接下来,您需要解压缩ngxin的安装包。您可以使用压缩软件,如WinRAR或7-Zip等工具进行解压缩。解压后会得到一个包含ngxin的文件夹。 在继续前,您需要确保您的机器上已安装了一些必需的依赖项,如GCC、pcre、openssl等。这些依赖项可以通过离线的方式手动安装,或者您可以将需要的依赖项的安装包一并下载并拷贝到离线的机器上进行安装。 然后,进入ngxin文件夹,找到其中的configure文件。在命令行终端中,使用命令"./configure"来配置ngxin的安装环境。根据您的需求,可以添加一些自定义的编译选项来定制ngxin的功能和特性。 配置完成后,可以运行"make"命令来进行ngxin的编译和构建。这个过程可能需要一段时间,具体取决于您的机器性能。如果一切顺利,编译成功后,可以运行"make install"命令来将ngxin安装到指定的目录下。 最后,在安装完成后,您可以根据需要对ngxin进行配置,如修改配置文件、添加虚拟主机等。当完成所有配置后,可以运行ngxin来启动服务器。 总而言之,ngxin1.20的离线安装需要准备ngxin安装包及其依赖项,并进行解压缩、配置、编译和安装等步骤。请注意,在离线环境下安装软件需要提前做好充分的准备和了解相应的操作步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值