Vijos1240 朴素的网络游戏

思考:

想了很久,感觉这个dp方程没法推导啊。

之后看了看题解才发现原来是自己把自己框在原地了。

首先题目中给了 男生 女生 情侣 房间 花费这几个信息。

看到 房间以及最小花费很容易想到背包 dp[x]...[x]+cost[i]这种的。

男生和女生我们可以看做二维费用背包,但是夫妻这个怎么处理呢。

仔细想想如果有2对夫妻 3对夫妻的情况 我们可不可以看做 2个男一个房 2个女一个房 3个男一个房3个女一个房(这种情况比夫妻住还优)的情况。

也就是可以忽略夫妻这个条件,不过要特判一下夫妻只有一个男的一个女的且为情况的情况就好了。

#include <cstdio>
#include <algorithm>
#include <cstring>
using std::min;
const int INF = 0x3f3f3f3f;

int m,f,r,c;
int cost[305],Size[305];
int dp[305][305],Min=INF;

int main(){
    memset(dp,INF,sizeof(dp));
    scanf("%d%d%d%d",&m,&f,&r,&c);
    for(int i=1;i<=r;i++){
        scanf("%d%d",&Size[i],&cost[i]);
    }
    if(m==1 && f==1 && c==1){
        int fuck = 2333333;
        for(int i=1;i<=r;i++){
            if(Size[i]>=2 && cost[i]<fuck) fuck = cost[i];
        }
        printf("%d\n",fuck);
        return 0;
    }
    dp[0][0]=0;
    c=0;
    for(int i=1;i<=r;i++){
            for(int k=m;k>=0;k--){
                for(int l=f;l>=0;l--){
                    if(k>Size[i])dp[k][l] = min(dp[k][l],dp[k-Size[i]][l]+cost[i]);
                    else dp[k][l] = min(dp[k][l],dp[0][l]+cost[i]);
                    if(l>Size[i])dp[k][l] = min(dp[k][l],dp[k][l-Size[i]]+cost[i]);
                    else dp[k][l] = min(dp[k][l],dp[k][0]+cost[i]);

                }
            }
    }
    Min = min(Min,dp[m][f]);
    if(Min==INF) printf("-1");
     else printf("%d\n",Min);
     return 0;
}
时间: 2024-10-12 19:31:52

Vijos1240 朴素的网络游戏的相关文章

回档|朴素的网络游戏

描述 佳佳最近又迷上了某款类似于虚拟人生的网络游戏.在游戏中,佳佳是某旅行团的团长,他需要安排客户住进旅馆.旅馆给了佳佳的旅行团一个房间数的限制.每一 个房间有不同的容纳人数和价钱(这个价格是房间的总价格,不是每个人付的).佳佳决定找到最小的花费,安排参加旅行的人住在这里.但是他遇到了这么一个问 题:两个不同性别的人不能住在同一个房间里,除非他们是夫妻:一对夫妻如果在一起住,那么别的人就不能再住进去.你不必让所有的夫妻都单独住在一起.也就 是说: 1.给你一些房间,告诉你这些房间的容纳人数和价格

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值. 是一种监督算法. 广泛应用于垃圾邮件检测等等. 1 # _*_coding:utf-8_*_ 2 from numpy import * 3 4 # 4-1 词表到向量的转换函数(实验样本) 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems

朴素和KMP模式匹配算法(Java)

朴素模式匹配算法 public class Test { //朴素模式匹配算法 public int Index(String s,String t,int pos){ int i = pos;//主串中第几个位置开始比较 int j = 0;//模式串中的第一个位置 while(i<s.length()&&j<t.length()){ if(s.charAt(i)==t.charAt(j)){ i++; j++; }else { i = i-j+1;//主串的下一个位置 j

Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏

著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能,因此使用ObjC语言利用IOS SDK的GameKit.framework的Peer-to-peer Connectivity实现了网络连接,在此分享. 啥话都不说,先上代码.点我下载工程文件, 类NetWorkP2P,继承自NSObject.提供GKSessionDelegate和GKPeerP

关于朴素贝叶斯

朴素贝叶斯或者说基于贝叶斯理论的决策方法都是生成式模型.那么什么是生成式模型呢?生成式模型和判别式模型的概念分别是什么?大体来说,给定数据集x,可以直接通过建模P(c|x)来预测c,这样得到的是判别式模型.像BP网络,支持向量机,决策树都属于判别式模型.如果先对联合概率分布P(x,c)建模,然后再由此获得P(c|x),这样得到的生成式模型,例如朴素贝叶斯. 朴素贝叶斯应用的先决条件是"属性条件独立假设",即已知类别,假设所有属性相互独立.

朴素贝叶斯分类器及Python实现

贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率分布. 贝叶斯公式: P(A∩B) = P(A)*P(B|A) = P(B)*P(A|B) 变形得: P(A|B)=P(B|A)*P(A)/P(B) 其中 P(A)是A的先验概率或边缘概率,称作"先验"是因为它不考虑B因素. P(A|B)是已知

机器学习之朴素贝叶斯分类

朴素贝叶斯分类 所有贝叶斯分类都是基于贝叶斯定理,朴素贝叶斯分类是贝叶斯分类中运用广泛简单的一种,另外,它还基于特征条件独立假设. 贝叶斯定理 贝叶斯定理是计算条件概率的公式,条件概率即是事件B发生的前提下事件A发生的概率,记作P(A|B),叫做事件B发生的情况下A的条件概率. 公式为:P(B|A)=P(A|B)P(B)P(A) 公式大致推导: 如图,有P(A|B)=P(A?B)P(B) 同样,也有P(B|A)=P(A?B)P(A) 于是,P(A|B)P(B)=P(B|A)P(A) 得到,P(B

我理解的朴素贝叶斯模型

我理解的朴素贝叶斯模型 我想说:"任何事件都是条件概率."为什么呢?因为我认为,任何事件的发生都不是完全偶然的,它都会以其他事件的发生为基础.换句话说,条件概率就是在其他事件发生的基础上,某事件发生的概率. 条件概率是朴素贝叶斯模型的基础. 假设,你的xx公司正在面临着用户流失的压力.虽然,你能计算用户整体流失的概率(流失用户数/用户总数).但这个数字并没有多大意义,因为资源是有限的,利用这个数字你只能撒胡椒面似的把钱撒在所有用户上,显然不经济.你非常想根据用户的某种行为,精确地估计一