流水依依

希望朋友们有个好的身体,开开心心工作与学习。

博客园 首页 新随笔 联系 订阅 管理

题目1395:爱钱的胡老板

时间限制:1 秒

内存限制:32 兆

特殊判题:

题目描述:

胡老板,别名浩帆,是九度技术组中最喜欢钱的一个,当然了,他钱肯定是没多少的,但是他唯一的乐趣也就是把玩手中不多的钱了。

胡老板难得出了趟国(当然了,也就越南老挝东南亚了,前面说了,他钱不多)。

在A国,他发现了一台自动兑换货币的机器。这时,他爱钱的兴趣又体现出来了,他想通过兑换一定数量的钱,来保证换取这个国家的所有种类的硬币。但是,这种自动兑换机的兑换策略并不知道,所以胡老板想让你帮忙计算下,是否存在这么一种可能,通过兑换一定数量的纸币,能够保证一定获取所有可能的硬币,假如存在,则只需要告诉胡老板其最小值;假如不存在,就输出-1。

例如,A国有2、5这两种面额的硬币,那么我们只需要兑换7面额的纸币即可保证获取2和5这两种面额的硬币;同样,若B国有1、2这两种面额的硬币,那我们就无能为力了,因为所有的面额,可能都是由面额为1的硬币组成。

 

输入:

每个测试案例包括两行:

第一行为整数N,代表硬币的种类,其中1 <= N <= 50。

第二行为N个大于0小于等于10000的整数,代表硬币的面额。注意,不同种类的硬币,面额也可能一样。

 

输出:

 

 

 

对于每个测试案例,输出一行:

若方案存在,则输出一个最小的值;若不存在,则输出-1。

 

 

 

样例输入:
2
2 5
2
1 2
2
1 1
样例输出:
7
-1
-1

完全背包,题目比较有新意吧。
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <set>
#include <limits.h>
#include <fstream>
#include <map>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
const int size=58 ;
struct Me{
   int N ;
   int sum ;
   int num[size] ;
   int dp[10000*50+1] ;
   Me(){}
   Me(int n):N(n){}
   int gao_qi(){
       sum=0 ;
       for(int i=1;i<=N;i++){
           scanf("%d",&num[i]) ;
           sum+=num[i] ;
       }
       fill(dp+1,dp+1+sum,0) ;
       dp[0]=1 ;
       for(int i=1;i<=N;i++){
          for(int j=num[i];j<=sum;j++){
              if(dp[j-num[i]]!=-1)
                   dp[j]+=dp[j-num[i]] ;
          }
       }
       return dp[sum]==1?sum:-1 ;
   }
};
int main(){
   int n ;
   while(scanf("%d",&n)!=EOF){
       Me me(n) ;
       printf("%d\n",me.gao_qi()) ;
   }
   return 0 ;
}

 

posted on 2013-08-15 09:42  流水依依  阅读(257)  评论(0编辑  收藏  举报