九度 题目1531 货币面值 (组合数学,母函数应用)

题目1531:货币面值

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:358

解决:133

题目描述:

小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧。

输入:

输入包含多个测试用例,每组测试用例的第一行输入一个整数N(N<=100)表示流通的纸币面额数量,第二行是N个纸币的具体表示面额,取值[1,100]。

输出:

对于每组测试用例,输出一个整数,表示已经发行的所有纸币都不能表示的最小面额(已经发行的每个纸币面额最多只能使用一次,但面值可能有重复)。

样例输入:
5
1 2 3 9 100
5
1 2 4 9 100
5
1 2 4 7 100
样例输出:
7
8
15
来源:
网易游戏2013年校园招聘笔试题


这里面每个货币面值不确定,所以用数组a【 】存起来
不过每个货币就一个
故母函数为: G(x)= (1 +x^a[1]) ( 1+ x^a[2] ) ( 1 + x^a[3]) ...( 1+ x^a[n])
***************************
# 2013-8-26 20:52:33 
# Time: 50MS   Memory: 1528KB
# Author: zyh
# Status: Accepted
***************************/
 
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
 
using namespace std;
 
int main()
{
    int n,i,j,k,Max,sum,c1[10010],c2[10010],a[110];
     
    while(scanf("%d",&n)!=EOF)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        Max = 0 ;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            Max +=  a[i];
        }
 
        c1[0] = 1;
        c1[a[1]] = 1;
        sum = a[1];
        for(i=2;i<=n;i++){
            for(j=0;j<=sum;j++){
                c2[j] += c1[j];
                c2[j+a[i]] += c1[j];
            } 
            sum += a[i]; //sum代表新计算出的两个括号里表达式 里面的项的 最高次幂
            for(j=0;j<=Max;j++){
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
 
        for(i=1;i<=Max;i++){
            if(c1[i]==0){
                printf("%d\n",i);
                break;
            }
        }
        if(i==Max+1){
            printf("%d\n",i);
        }
    }
    return 0;
} 
/**************************************************************
    Problem: 1531
    User: cin_cout
    Language: C++
    Result: Accepted
    Time:50 ms
    Memory:1528 kb
****************************************************************/





你可能感兴趣的:(九度 题目1531 货币面值 (组合数学,母函数应用))