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. NGUI OnChange Event

    那些组件有OnChange? 下面这些组件都有OnChange事件,当你点击,下拉选择时,就会触发它们. NGUI中对应的组件 PopupList (下拉列表) Toggle (复选框) Input ...

  2. 在3D Max中查看模型引用的贴图

    需求 假如在Max中有一个模型,想查看贴图 操作步骤 1.右上角点击 2.在弹出材质编辑器中 点击吸管 3.把吸管点击在角色模型上,然后点击M 4.点击查看图像 5.就能查看到模型使用的贴图

  3. java 15 - 8 集合框架(并发修改异常的产生原因以及解决方案)

    问题?   我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现.  面试题: Concu ...

  4. java 15 - 6 List的方法

    List集合的特有功能: A:添加功能 void add(int index,Object element):在指定索引处添加元素 B:获取功能 Object get(int index):获取指定索 ...

  5. 时间与NSString转换

    //传进来时间字符串转换 + (NSString *) getChatTimeString:(NSString *)timeString { if (timeString==nil || timeSt ...

  6. templatecolumn checkcolumn

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

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

  8. Linux 网络编程三(socket代码详解)

    //网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  9. Bootstrap 表格

    Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. <thead> 表格 ...

  10. sql server 2008 登录 4064 错误解决办法

    出现这个错误是账户无法打开默认数据库导致的 修改一下该账户的默认打开数据库即可. 如果很不幸,你的sa帐号和windows身份验证默认都打开同一个数据库,那么无论换哪种方式登录都是一样没用的 如果你有 ...