2024年最全【c++百日刷题计划】 —

本文介绍了在给定价格和重要度的情况下,如何通过背包问题解决策略找到物品选择的最大价值总和。同时讨论了组合问题,如从n个元素中选取r个元素的排列组合,使用深度优先搜索算法实现。
摘要由CSDN通过智能技术生成

N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第

j

j

j件物品的价格为

v

[

j

]

v[j]

v[j],重要度为

w

[

j

]

w[j]

w[j],共选中了

k

k

k件物品,编号依次为

j

1

,

j

2

,

,

j

k

j_1,j_2,…,j_k

j1​,j2​,…,jk​,则所求的总和为:

v

[

j

1

]

×

w

[

j

1

]

v

[

j

2

]

×

w

[

j

2

]

v

[

j

k

]

×

w

[

j

k

]

v[j_1] \times w[j_1]+v[j_2] \times w[j_2]+ …+v[j_k] \times w[j_k]

v[j1​]×w[j1​]+v[j2​]×w[j2​]+…+v[jk​]×w[jk​]。

请你帮助金明设计一个满足要求的购物单。

输入格式

第一行,为

2

2

2个正整数,用一个空格隔开:

n

,

m

n,m

n,m(其中

N

(

<

30000

)

N(<30000)

N(<30000)表示总钱数,

m

(

<

25

)

m(<25)

m(<25)为希望购买物品的个数。)

从第

2

2

2行到第

m

1

m+1

m+1行,第

j

j

j行给出了编号为

j

1

j-1

j−1的物品的基本数据,每行有

2

2

2个非负整数$ v p

(其中

(其中

(其中v

表示该物品的价格

表示该物品的价格

表示该物品的价格(v \le 10000)

,p$表示该物品的重要度(

1

5

1-5

1−5)

输出格式

1

1

1个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值

(

<

100000000

)

(<100000000)

(<100000000)。

样例 #1

样例输入 #1
1000 5
800 2
400 5
300 5
400 3
200 2

样例输出 #1
3900

解题思路

  • 1)简单的01背包问题,直接背板子。

参考代码

#include<bits/stdc++.h>
using namespace std;
int dp[105000];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int v,p;
		cin>>v>>p;
		for(int j=n;j>=v;j--)
		{
			dp[j]=max(dp[j],dp[j-v]+v\*p);
		}
	}
	cout<<dp[n];
    return 0;
}

第三题 组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从

n

n

n 个元素中抽出

r

r

r 个元素(不分顺序且

r

n

r \le n

r≤n),我们可以简单地将

n

n

n 个元素理解为自然数

1

,

2

,

,

n

1,2,\dots,n

1,2,…,n,从中任取

r

r

r 个数。

现要求你输出所有组合。

例如

n

=

5

,

r

=

3

n=5,r=3

n=5,r=3,所有组合为:

123

,

124

,

125

,

134

,

135

,

145

,

234

,

235

,

245

,

345

123,124,125,134,135,145,234,235,245,345

123,124,125,134,135,145,234,235,245,345。

输入格式

一行两个自然数

n

,

r

(

1

<

n

<

21

,

0

r

n

)

n,r(1<n<21,0 \le r \le n)

n,r(1<n<21,0≤r≤n)。

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

**注意哦!输出时,每个数字需要

3

3

3 个场宽。以 C++ 为例,你可以使用下列代码:**

cout << setw(3) << x;

输出占

3

3

3 个场宽的数

x

x

x。注意你需要头文件 iomanip

样例 #1

样例输入 #1
5 3

样例输出 #1
  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5

解题思路

  • 1)深度优先搜索题目。
  • 2)每个数字只能出现一次,我们从小到大搜索。
  • 3)如果该数字没有被使用,我们将该数字填入答案,标记为使用过,然后调用下一层。
  • 4)当步数为题目要求,输出然后回溯。

参考代码

#include<bits/stdc++.h>
using namespace std;
int used[100];
int n,r;
int a[200];
void dfs(int num,int step)
{
	if(step==r)
	{
		for(int i=0;i<r;i++)
		{
			cout<<setw(3)<<a[i];
		}
		cout<<endl;
		return;
	}
	
	for(int i=num;i<=n;i++)
	{
		if(!used[i])
		{
			used[i]=1;
			a[step]=i;
			dfs(i+1,step+1);
			used[i]=0;		
		}
	}
	
}

int main()
{
	cin>>n>>r;
	dfs(1,0);
	return 0;
}

第四题 【深基18.例3】查找文献

题目描述

小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

假设洛谷博客里面一共有

n

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

,输出然后回溯。

参考代码

#include<bits/stdc++.h>
using namespace std;
int used[100];
int n,r;
int a[200];
void dfs(int num,int step)
{
	if(step==r)
	{
		for(int i=0;i<r;i++)
		{
			cout<<setw(3)<<a[i];
		}
		cout<<endl;
		return;
	}
	
	for(int i=num;i<=n;i++)
	{
		if(!used[i])
		{
			used[i]=1;
			a[step]=i;
			dfs(i+1,step+1);
			used[i]=0;		
		}
	}
	
}

int main()
{
	cin>>n>>r;
	dfs(1,0);
	return 0;
}

第四题 【深基18.例3】查找文献

题目描述

小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

假设洛谷博客里面一共有

n

[外链图片转存中…(img-pLMyM1ii-1714671810064)]
[外链图片转存中…(img-rigiMg4s-1714671810064)]
[外链图片转存中…(img-X9fLCfxE-1714671810064)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值