您的位置:首页 > 其它

程序设计思维与实践 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;
}

具体题目:

  • 点赞
  • 收藏
  • 分享
  • 文章举报
banzixiang 发布了8 篇原创文章 · 获赞 1 · 访问量 206 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: