ブルーブリッジカップ第8回まんじゅう

2038 ワード

タイトル:まんじゅう
明ちゃんはほとんど毎朝まんじゅう屋で朝食を食べます.彼はこのまんじゅうにN種類の蒸し器が敷かれていることに気づいた.その中のi種類目の蒸し器にはちょうどAi個のまんじゅうが入れられる.どの蒸し器にも非常に多くのケージがあり、無限のケージと考えられます.
お客さんがX個のまんじゅうを買いたいと思っているたびに、まんじゅうを売っているおじさんはすぐにいくつかのまんじゅうを選んで、このいくつかのかごの中にちょうどX個のまんじゅうがあります.例えば全部で3種類の蒸し器があり、それぞれ3、4、5個のまんじゅうを入れることができます.お客様が11個のまんじゅうを買いたい場合、おじさんは2かご3個に1かご5個を追加します(1かご3個に2かご4個を追加することもできます).
もちろん、まんじゅうおじさんはどうしてもお客さんが買いたい数が集まらないこともあります.例えば全部で3種類の蒸し器があり、それぞれ4、5、6個のまんじゅうを入れることができます.客がまんじゅうを7個買おうとしたとき、おじさんは出てこなかった.
明ちゃんは全部で何種類の数がまんじゅうおじさんにはできないのか知りたいと思っています.
入力---最初の行には整数Nが含まれます.(1<=N<=100)以下のN行は、行ごとに整数Aiを含む.(1 <= Ai <= 100)  
出力---整数は答えを表します.寄せられない数が無限に複数ある場合はINFを出力します.
たとえば、2 4 5と入力します.
プログラム出力:6
たとえば、2 4 6と入力します.
プログラム出力すべき:INF
サンプル解釈:サンプル1について、集約できない数は、1,2,3,6,7,11を含む.サンプル2については,すべての奇数が揃わないため,無限に複数ある. 
リソース約定:ピークメモリ消費(仮想マシン含む)<256 M CPU消費<1000 ms
要求通りに出力してください.ヘビを描いて印刷しないでください.「入力してください.」と入力します.
注意:main関数は0を返す必要があります.ANSI C/ANSI C++標準のみ使用します.コンパイル環境やオペレーティングシステムに依存する特殊な関数を呼び出さないでください.すべての依存する関数は、ソースファイルでincludeがエンジニアリング設定によって共通ヘッダファイルを省略できないことを明確にしなければならない.
プログラムをコミットするときは、所望の言語タイプとコンパイラタイプを選択することに注意してください.
 
問題:
n=2と仮定すると,2種類のまんじゅう:それぞれa,bであり,要求が満たされていない(顧客がまんじゅうを買いたい数をちょうど集めることができる)個数である.お客様がまんじゅうをZ、a種まんじゅうをx個、b種まんじゅうをy個買いたいと仮定します.そしてa,bの最大公約数がdであれば、a*x+b*y=dを得ることができる.まんじゅうおじさんがちょうど集まることができれば、Zにdの倍数が必要であることが明らかになり、最終的な答えがINFの場合d!=1(d>1の場合、無限の顧客が買いたいまんじゅうの数の中でおじさんにちょうど寄せられるのはdの倍数であって、dの倍数ではない数は無限である)ので、ここではまずユークリッドアルゴリズムを用いてこのnの数の最大公約数が1であるかどうかを求め、1であれば完全リュックサックのアルゴリズムでまんじゅうおじさんが寄せられないZを求め、1でなければINFを出力する必要がある
#include 
using namespace std;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int c[105];
    bool dp[100010];
    int n;
    cin>>n;
    for(int i=0;i>c[i];
    int m=c[0];
    memset(dp,false,sizeof(dp));
    dp[0]=true;
    for(int i=1;i