解题思路
优先选择性价比最大的物品(重量/价值)可以得到最优解。
代码实现
#include<iostream>
#include<cstdio>
#include<algorithm>
#define SIZE 101
using namespace std;
// 物品 结构体 **
struct goods{
double w; // 重量
double v; // 价值
double s; // 性价比(重量价格比)
bool operator <(const goods &A) const{ // 贪心的规则
return s > A.s; // 按性价比降序排序
}
}buf[SIZE];
double m;
int n; // m元钱,n种物品
int main()
{
while(cin>>m>>n){
if(m==-1 && n==-1) break; // 退出条件
for(int i=0;i<n;i++){
cin>>buf[i].w>>buf[i].v;
buf[i].s = buf[i].w/buf[i].v;
}
sort(buf,buf+n); // 排序 **
double ans=0.0;
int num=0;
while(m>0 && num<n){ // 有剩余的钱或有商品挑选
if(m>buf[num].v){ // 剩下的钱可以买整个
ans += buf[num].w;
m -= buf[num].v;
}
else{ // 剩下的钱不足以买整个(买部分)
ans += m*buf[num].s;
m = 0;
}
num++;
}
printf("%.3f",ans); // 注意:%.3lf时输出为-0.000
// 参考文章:https://blog.csdn.net/sinat_14958547/article/details/37877405
//cout.precision(3);
//cout<<fixed<<ans<<endl;
}
return 0;
}
注:
不能在printf中使用%lf。printf()用%f输出double型,而scanf用%lf。
解题思路
优先选择结束时间最早的节目可以得到最优解。
代码实现
#include<iostream>
#include<algorithm>
#define SIZE 100
using namespace std;
struct Program{
int start;
int end;
bool operator < (const Program &A)const{
return end < A.end; // 按照结束时间升序排序
}
}buf[SIZE];
int n;
int main()
{
while(cin>>n){
if(n==0) break;
for(int i=0;i<n;i++){
cin>>buf[i].start>>buf[i].end;
}
sort(buf,buf+n); // 排序
int ans=0,cur=0;
for(int i=0;i<n;i++){
if(cur<=buf[i].start){
ans++;
cur = buf[i].end; // 下一次的初始时间
}
}
cout<<ans<<endl;
}
return 0;
}