这件事情的起因是在学习背包问题时突然想到了一种算法,分析了一下应该是n^2logn复杂度的,当然比dp慢。但是既然想到了就实现了下:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
/*一个很低效的方法,但是是自己想到的,就顺手实现了一下。本质是基于穷举法的优化,不再循环所有物品选取的组合,而是循环状态。
大致地看,其一定是比穷举法要快些的,因为其合并了穷举法的许多情况,即处于“现在背包中物品的总价值相同且剩余空间相同”的不同物品选取情况。
但是其的复杂度至少是n^2*logn级别的,因为其需要对每一个物品循环set中的元素并不断插入新的状态,而且还涉及到了类的存储,速度应该会更慢一些 */
class stateNow{
public:
int sizeRest;
int valueAll;
bool operator <(const stateNow& te)const{
if((this->sizeRest<te.sizeRest)||(this->sizeRest==te.sizeRest&&this->valueAll>te.valueAll))
return true;
else
return false;
}
};
int main(){
int n,size;
scanf("%d %d",&n,&size);
int *objectSize=new int[n];
int *objectValue=new int[n];
set<stateNow>::iterator it;
set<stateNow>stateCollection;
int maxValue=;
for(int i=;i<n;i++){
scanf("%d %d",&objectSize[i],&objectValue[i]);//不能把\n也加到字符串里,\n是输入结束的标志,将它也读入的话会影响结束
}
for(int i=;i<n;i++){
if(!stateCollection.empty()){
for(it=stateCollection.begin();it!=stateCollection.end();it++){
stateNow temp;
temp.sizeRest=it->sizeRest-objectSize[i];
temp.valueAll=objectValue[i]+it->valueAll;
if(temp.sizeRest==){
if(temp.valueAll>maxValue)
maxValue=temp.valueAll;
}
if(temp.sizeRest>)
stateCollection.insert(temp);
}
}
stateNow temp;
temp.sizeRest=size-objectSize[i];
temp.valueAll=objectValue[i];
stateCollection.insert(temp);
}
printf("%d",maxValue);
getchar();
}
}

这里就涉及到了一个向set中传入自定义类型的问题,查到了一篇博文,正好在讲这个问题,这里就不引用原文了,大家直接点击链接看吧:https://www.cnblogs.com/shawnhue/archive/2011/12/22/set_comparison_strick_weak_ordering.html

为什么需要定义比较函数对象或者自定义<运算符呢?因为set内部是有序排列的(红黑树),并且要保证元素的唯一性,所以需要一个能用来比较两元素的方法。(two keys k1 and k2 are considered to be equivalent if for the comparison object comp, comp(k1, k2) == false && comp(k2, k1) == false.

另外,由博文中所说,总是让比较函数使被比较对象满足严格的弱序,即

严格弱序化拥有如下属性。对于集合S中所有的x,y,z,

对于所有的x,不存在x < x (非自反性 - 21条标题说的就是这个)

对于所有x不等于y,如果x < y那么不存在y < x (不对称性)

对于所有的x,y和z,如果x < y并且y < z,那么x < z(传递性)

如果x < y,那么对于所有的z,要么x < z要么z < y(或者两者都成立)

这一点在自定义<运算符时要注意,否则所进行的操作就是未定义行为,会出现意料之外的错误。

在set中放入自定义类型的更多相关文章

  1. springmvc 中model中放入枚举类型

    我们直接看样例: Map<String, String> mallMap = new HashMap<String, String>(); mallMap.put(MallSt ...

  2. [转]std::set、自定义类型与比较函数

    转自:http://www.189works.com/article-42025-1.html 怎样在set中放入自定义类型?这个问题通过谷歌就可以得到不少答案:1.定义一个函数对象并在定义set的时 ...

  3. java编程排序之自定义类型的集合,按业务需求排序

    自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object ...

  4. Unity3d地形刷入自定义树木

    Unity3d中新建地形后,可以在地形上刷草及树木等植物.那么接下来讲的就是如何刷入自定义树木. 我没有自定义的树木素材,所以就以导入的坦克模型为例,目标是将坦克模型的炮塔部分作为自定义“树木”刷入地 ...

  5. java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)

    由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法, ...

  6. 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)

    1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...

  7. C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)

    今天在进行代码测试时发现,尝试在一个方法中定义一个委托,注意是定义一个委托,而不是声明一个委托变量,在编写的时候没有报错,VS也能智能提示,但在编译时却报语法不完整,缺少方括号,但实际查询并没有缺少, ...

  8. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  9. sruts2 自定义类型转换器

    1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP ...

随机推荐

  1. 一本学习HTTP很好的书《图解HTTP》

    网上电子版的一堆(*^__^*) 嘻嘻……

  2. IP输出 之 分片ip_fragment、ip_do_fragment

    概述 ip_fragment函数用于判断是否进行分片,在没有设置DF标记的情况下进入分片,如果设置了DF标记,则继续判断,如果不允许DF分片或者收到的最大分片大于MTU大小,则回复ICMP,释放skb ...

  3. linu逻辑分区动态调整大小

    注意: 这个动态调整的方法是有丢数据风险的,要确保调整的源分区没有使用或者使用率很低.源分区中如果有重要的文件最好先备份 在centos 6.5上操作过 lvdisplay 查看已有的分区的大小 lv ...

  4. SVN服务器的安装

    运行VisualSVN-Server-2.7.3.msi程序, 如下图 点击Next, 下一步 选中 I accept选项, 点击Next, 下一步 选择默认配置, 服务和控制台组件方式, 点击Nex ...

  5. NAT地址转换常用命令详解

    缺省值:没有启用NAT. 命令模式:全局配置模式. 说明:静态NAT主要用于那些对需要对外部用户开放的服务,如Web服务器等,它可以把本地地址映射为指定的全局地址. 第一种格式实现的是一对一的NAT映 ...

  6. C# lock 为什么要设置成只读

    首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行, ...

  7. docker commit命令

    docker commit命令用于基于一个容器来创建一个新的docker镜像. docker commit制作的镜像,除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知.建议使用的是 ...

  8. 使用Navicat为Oracle新增用户

    步骤请参考帖子https://www.cnblogs.com/franson-2016/p/5925593.html 需要注意的是新增用户时不能使用小写,否则不能登录,之前新增一个小写的用户名,授予c ...

  9. 系统 --- Linux系统环境搭建

    Linux命令介绍 软硬链接 作用:建立连接文件,linux下的连接文件类似于windows下的快捷方式 分类: 软链接:软链接不占用磁盘空间,源文件删除则软链接失效 硬链接:硬链接只能链接不同文件, ...

  10. WCF客户端代理

    创建类库WCFServiceProxy 添加System.ServiceModel.WCFService(见上篇文章)引用 创建类:BookServiceClient using System; us ...