http://poj.org/problem?id=1010 (题目链接)

感到了英语深深的恶意。。。

题意(真的很难懂。。。。)

  第一行数字是邮票的面值,每一个数字就是一个不同的种类,哪怕面值相同。以0结束。第二行数字是顾客所需要的邮票总面值。每个数字就是一个顾客的需求,以0结束。每两行是一组case。顾客是集邮爱好者,所以你必须尽可能的给他不同种类的邮票。但是一位顾客最多只能拿4张邮票。显然,我们拥有的邮票就是第一行中的数据。 
  关于tie: 
    满足顾客需求的解就是可行解。 
    邮票种类最多的可行解为最优。 
    如果存在两个以上的最优解的邮票种类是一样的,张数最少的更优 
    张数也一样的话,这些最优解中最大面值较大的更优。 
    若邮票种类、张数、最大面值三者都分别相同,则认为这些最优解相同,输出tie。 
    没有解就是none。

Solution

  这不就是裸的dfs吗。。加几个可行性剪枝就可以轻松过了。

代码

// poj1010
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=10010;
int a[maxn],ans[maxn],t[maxn],b[maxn],vis[maxn];
int n,m,flag; void work3() {
int t1=0,t2=0;
for (int i=1;i<=4;i++) {
t1=max(a[t[i]],t1);
t2=max(a[ans[i]],t2);
}
if (t1>t2) {flag=3;for (int i=0;i<=n;i++) ans[i]=t[i];}
else if (t1==t2) flag=4;
}
void work2() {
int t1=4,t2=4;
for (int i=1;i<=4;i++) {
if (t[i]==0) t1--;
if (ans[i]==0) t2--;
}
if (t1<t2) {flag=2;for (int i=0;i<=n;i++) ans[i]=t[i];}
else if (t1==t2) work3();
}
void work1() {
t[0]=0;
for (int i=1;i<=n;i++) vis[i]=0;
for (int i=1;i<=4;i++) if (t[i] && !vis[t[i]]) {vis[t[i]]=1;t[0]++;}
if (ans[0]<t[0]) {flag=1;for (int i=0;i<=4;i++) ans[i]=t[i];}
else if (ans[0]==t[0]) work2();
}
void dfs(int x,int p,int w,int W) {
if (x==5) {
if (w==W) work1();
return;
}
if (w>=W || w+(4-x+1)*a[n]<W) return;
for (int i=p;i<=n;i++) {
t[x]=i;
dfs(x+1,i,w+a[i],W);
}
}
int main() {
while (1) {
n=m=1;
while (scanf("%d",&a[n])!=EOF && a[n]) n++;
if (n==1) break;
n--;
while (scanf("%d",&b[m])!=EOF && b[m]) m++;
m--;
sort(a+1,a+1+n);
for (int i=1;i<=m;i++) {
for (int j=0;j<=4;j++) ans[j]=0;
printf("%d ",b[i]);
flag=0;
dfs(1,0,0,b[i]);
if (flag==4) printf("(%d): tie\n",ans[0]);
else if (flag==0) printf("---- none\n");
else {
printf("(%d):",ans[0]);
for (int i=1;i<=4;i++) if (ans[i]) printf(" %d",a[ans[i]]);
printf("\n");
}
}
}
return 0;
}

  

【poj1010】 STAMPS的更多相关文章

  1. 【DFS】STAMPS

    [Poj1010]STAMPS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18867   Accepted: 5469 ...

  2. 【Uva 242】Stamps and Envelope Size

    [Link]: [Description] 给你n个集合; 每个集合都包含一些不同面额的邮票; (每种邮票都当做有无限张) 然后给你一封信上最多能贴的邮票张数S; 问你,哪一个集合的邮票; 能够贴出来 ...

  3. 【POJ2096】Collecting Bugs 期望

    [POJ2096]Collecting Bugs Description Ivan is fond of collecting. Unlike other people who collect pos ...

  4. 【OS】NMON的简介和使用

    [OS]NMON的简介和使用 目前NMON已开源,以sourceforge为根据地,网址是http://nmon.sourceforge.net. 1. 目的 本文介绍操作系统监控工具Nmon的概念. ...

  5. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  9. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

随机推荐

  1. IO流的练习 —— 创建用户注册、登陆案例

    把上次用集合做的时候的分析拿出来 需求: 用户登录注册案例 按照如下操作,可以让我们更符合面向对象思想: A:这个案例有哪些类 B:每个类中又有哪些东西 C:类与类之间的关系 分析: A:这个案例有哪 ...

  2. java12-6 冒泡排序法和选择排序法

    1.冒泡排序法 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 分析: 第一次比较排序的结果:会把其中最大的数据排到最大的索引处 第二次比较排序后的结果:因为第一次已经把最大的一个 ...

  3. sort()和qsort()方法详解

    1,C++自带的自动排序方法:sort(); 要使用此函数只需用#include <algorithm> sort即可使用. sort(begin,end),表示一个范围,例如: int ...

  4. openstack中彻底删除计算节点的操作记录

    在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...

  5. Linux下检测IP地址冲突及解决方法

    问题说明:在公司办公网内的一台物理机A上安装了linux系统(ip:192.168.9.120),在上面部署了jenkins,redmine,svn程序.由于是在办公网内,这台机器和同事电脑都是在同一 ...

  6. 在Centos5下安装GraphicsMagick

    安装GraphicsMagick的流水账: 安装参照的http://www.graphicsmagick.org/INSTALL-unix.html 解压 /home/milton/GraphicsM ...

  7. struts2验证框架

    如何做一个工号 用户 密码 验证登录页面? 答:1,先画一个login.jsp ,如何画呢?先引入Struts2标签库,利用Struts2标签库画登录页面:如下: 2,先进入useractiion,在 ...

  8. 【转】【C#】C# 垃圾回收机制

    摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...

  9. 【原创】有关Silverlight DataGrid双击事件的分析 完整分析 代码与示例

    公司项目用的silverlight,而且silverlight一些技术 资料比较少.所以分享出来 给大家参考参考. 有关Silverlight中DataGrid 双击事件 的代码 如下: 1. 前台x ...

  10. C语言 百炼成钢5

    //题目13:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 //本身.例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方. #de ...