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. 移动App崩溃测试用例设计

    我们的日常生活中对移动设备越来越多的使用意味着移动App测试这个主题已成为需要考虑的一个无法避免的问题.根据最近的调查研究,用户难以容忍有bug的移动App. 移动App Bug的影响是用户体验差.A ...

  2. IO流的练习2 —— 复制单级文件夹中的文件

    需求:把C:\Users\Administrator\Desktop\记录\测试里面的所有文件复制到 C:\Users\Administrator\Desktop\新建文件夹\copy文件夹中 分析: ...

  3. usb驱动开发9之设备描述符

    前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),配置描述符,最后分析设备如何包括这些描述符.首先记住,在usb的世界里,设备大于配置,配置大于接口,接 ...

  4. Redmine 项目管理工具----完全攻略

    摘要: 此篇博客涉及 安装,插件修改,插件安装,代码显示,中文乱码,SVN配置等内容,几乎覆盖所有redmine基本功能. 本机环境: Redmine 版本: 3.2.0 本机环境: win7 64位 ...

  5. 基于CoreText的基础排版引擎

    storyboard: 新建一个CTDisplayView:UIView 代码如下: #import "CTDisplayView.h" #import "CoreTex ...

  6. HDU3923-Invoker-polya n次二面体

    polya定理.等价类的个数等于∑颜色数^置换的轮换个数 不可翻转的串当中.直接计算∑m^(gcd(n,i)) ,这里gcd(n,i)就是第i个置换的轮换数. 翻转的情况再分n奇偶讨论. n次二面体都 ...

  7. Opencv step by step - 自适应阈值

    上个博客提到的阈值化只是针对图像全局进行阈值化,opencv提供了一个更好的函数cvAdaptiveThreshold,可以做到局部特征的阈值化,这样一来, 整个图像的信息可以被更好的提取. #inc ...

  8. 问卷调查——答卷

    1.你对自己的未来有什么规划?做了哪些准备?答:对未来的规划,就是像大多数人一样,在学校里有一个好的成绩,掌握扎实的专业基础,然后在国考上得到一个好成绩,得到一个好的工作机会,然后努力工作.目标很简单 ...

  9. java内存优化牛刀小试

    小猿做了两年的c++,上个月竟然被调到java项目,于是第一篇随笔就想八一八java的内存优化. 首先优化这种事,肯定是应该放到最后去做的,不过在写代码的过程中养成良好的习惯也是很重要的.在这里先推荐 ...

  10. 记”Uri.IsWellFormedUriString”中的BUG

    场景 先上逻辑代码 1: /// <summary> 2: /// 图片真实地址 3: /// </summary> 4: public string FullImagePat ...