杭电 acm 1085 Holding Bin-Laden Captive!
思路很简单:
0)数组T[i]表示面额 i 是否能组成。
1)先用硬币面额1(num_1个)的,看看组成哪些面额(1~num_1);
2)再加上面额为2(num_2个)的,,两层循环,外层为使用 j 个面额为2的硬币,内层将之前使用1组成的所有加 2*j 置为true,表示这个面额可以实现了 ;
3)再加上面额为5(num_5个)的,如同步骤2,;
#include <iostream>
#include <cstring>
using namespace std;
const int NUM=10000+10;
bool T[NUM];//用于标志第i位是否能组成
int main()
{
int a,b,c;
while(cin>>a>>b>>c)
{
if(a==0&&b==0&&c==0)break;
memset(T,0,sizeof(bool)*NUM);
memset(t,0,sizeof(bool)*NUM);
//只有1时
for(int i=0 ;i<=a ;++i)
{
T[i]=true;
}
//加上2
for(int i=0; i<=b; i++)
{
for(int j=0;j<=a;++j)
{
if(T[j])T[j+i*2]=true;
}
}
//加上5
for(int i=0; i<=c; i++)
{
for(int j=0;j<=a+2*b ;++j)
{
if(T[j])T[j+i*5]=true;
}
}
for(int i=0;i<=a+b*2+5*c+1;++i)
{
if(!T[i])
{
cout<<i<<endl;
break;
}
}
}
}