这件事情的起因是在学习背包问题时突然想到了一种算法,分析了一下应该是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. Git客户端TortoiseGit下载、安装及汉化

    本篇经验将和大家介绍Git客户端TortoiseGit下载.安装及汉化的方法,希望对大家的工作和学习有所帮助! TortoiseGit下载和安装   1 TortoiseGit是Windows下最好用 ...

  2. python pymysql 连接 mysql数据库进行操作

    1.数据库的连接操作 import pymysql conn = pymysql.connect(host=', db='oldboydb') # host表示ip地址,user表示用户名,passw ...

  3. Centos 安装freesurfer fsl matlab 等软件---转自网络

    freesurfer: freesurfer好安装,只需要下载官网源码包,如freesurfer5.3.tar.gz 下载至本地,解压: tar zxvf freesurfer5.3.tar.gz - ...

  4. ubuntu安装相关

    安装系统参考:http://xinzhi.wenda.so.com/a/1523530837610141 首先进行更新源 sudo apt-get update 安装codeblocks sudo a ...

  5. openerp学习笔记 计划动作、计划执行(维护计划)

    示例代码: data/scheduler.xml <?xml version="1.0" encoding="utf-8"?><openerp ...

  6. c# httphelper (苏飞老师)

    /// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...

  7. fiddler抓取https的请求详解

    本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤,特别是fiddler在设置证书的环节遇到的各种奇葩问题,特此分享! 声明:本文为原创文章,转载请注明来源:https: ...

  8. Swift3.0基础语法学习<一>

    // // ViewController.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/15. // Copyright © 2016年 ...

  9. PJzhang:微软出口管制条例

    猫宁!!! 翻译:PJzhang 微软公司的技术,产品和服务受美国出口管理法规(EAR)的约束,由美国商务部工业与安全局(BIS)监督执行. 此外,财政部,国务院对其他与出口相关的技术和产品转让,交易 ...

  10. 思科设备自动退出配置界面、打断命令输入、禁用DNS查询

    1.自动退出配置界面 问题及原因:当设备没有被操作,空闲一段时间后,控制台回到初始化界面.控制台默认会话时间为10分钟,过期后跳转初始化界面 解决办法:配置控制台永不超时 Switch(config) ...