【c++百日刷题计划】 —(1)

1

5

1-5

1−5表示,第

5

5

5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过

N

N

N元(可以等于

N

N

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)


![img](https://img-blog.csdnimg.cn/img_convert/c8b8ac0016104e98c04736429b694342.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c499172b74b5354b3abe0cf1d87331b.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 
 
 
 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)

[外链图片转存中…(img-bVgmBFkn-1714166565212)]
[外链图片转存中…(img-uiiqsdar-1714166565213)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值