程序设计思维与实践 Week3 作业A 选数问题
2020-03-10 00:19
148 查看
题意:
一开始给定一个数,即为数据的组数。每组数据有两行,其中第一行三个数,分别为该组数据的个数,要选择的数据的个数和要选择的数据的和,第二行即为一组数据。要求在这组数据中,选择给定个数的数据,且这几个数据的和为给定要求的和,求这样的解的个数。(具体题目截图贴在最后面)。
思路:
利用递归搜索的方法,对数组中的每个数有选择和不选择两种可能性。不妨设给定的和为sum,给定的数据个数为k。在递归中,将sum和k的值作为参数进行传递。当选则这个数的时候,即有sum-a[i]和k-1带入下一轮递归中;若没选择这个数的时候,即将sum和k直接带入下一轮循环中。当sum0且k0的时候,即找到一组解,记录数加一。在递归中,注意若sum和k的值已经为负数的时候,即已经不符合题意,即递归结束,并且当i的值若大于数组元素的个数的时候,该轮递归也结束。
总结:
主要利用的递归求解的方法,在递归中注意选择和不选择的时候,带入下一轮的时候的参数的改变情况。同时注意剪枝的使用,另外觉得用sum和k,从开始然后依次递减的方法挺好用。
代码:
#include <iostream> #include <algorithm> using namespace std; struct P{ int a; int b; bool operator<(const P& p){ if(b!=p.b ) return b<p.b; if(a!=p.a) return a>p.a; } }; int main(){ int n; cin>>n; P p[n]={0}; for(int i=0; i<n; i++){ cin>>p[i].a>>p[i].b; } sort(p,p+n); int count=0; int m=p[0].b; count++; for(int i=1; i<n; i++){ if(m<p[i].a){ count++; m=p[i].b; } } cout<<count<<endl; return 0; }
具体题目:
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【20200304程序设计思维与实践 Week3 作业】
- 程序设计思维与实践 Week2 作业 (3/4/数据班) A - Maze
- 【20200226程序设计思维与实践 Week2 作业】Maze & Pour Water
- 【程序设计思维与实践 Week2 作业 A】Maze
- 程序设计思维与实践 Week2 作业2道
- 程序设计思维与实践 Week 2 作业:A Maze、B PourWater
- 程序设计思维与实践 Week3 作业C 区间覆盖
- 程序设计思维与实践 Week3 作业 B区间选点
- 【20200228程序设计思维与实践 Week2 实验】C-打牌
- 【程序设计思维与实践 Week2 实验C】瑞神打牌
- 【20200228程序设计思维与实践 Week2 实验】B - 爆零(×)大力出奇迹(√)
- 【程序设计思维与实践 Week2 实验B】 爆零(×)大力出奇迹(√)
- 程序设计思维与实践 - Week3 习题
- 程序设计思维与实践 - Week2 习题
- 程序设计思维 week2 作业A-Maze
- 程序设计思维与实践 Week2 实验:C - 瑞神打牌 (不支持C++11;G++和C++编译器都试试!)
- 程序设计Week2作业题B_倒水问题
- 程序设计思维与实践 Week2 实验:B - 爆零(×)大力出奇迹(√)
- 程序设计思维与实践——第二周作业
- 程序设计思维与实践 Week2 实验 (3/4/数据班) C - 瑞神打牌