Time Limit: 1000MS
Memory Limit: 10000K
Total Submissions: 24850
Accepted: 8716
Description
A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The machine uses exactly N distinct bill denominations, say Dk, k=1,N, and for each denomination Dk the machine has a supply of nk bills. For example,Input
The program input is from standard input. Each data set in the input stands for a particular transaction and has the format:Output
For each set of data the program prints the result to the standard output on a separate line as shown in the examples below.Sample Input
735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10
Sample Output
735 630 0 0
Hint
The first data set designates a transaction where the amount of cash requested is @735. The machine contains 3 bill denominations: 4 bills of @125, 6 bills of @5, and 3 bills of @350. The machine can deliver the exact amount of requested cash.Source
Southeastern Europe 2002#include
#include
#include
#include
#define N 100005
int f[N],cash;
int Max(int a,int b)
{
return a>b?a:b;
}
void Zeroone(int cost) //01背包
{
int i;
for(i=cash;i>=cost;i--)
f[i]=Max(f[i],f[i-cost]+cost);
}
void Comple(int cost) //完全背包
{
int i;
for(i=cost;i<=cash;i++)
f[i]=Max(f[i],f[i-cost]+cost);
}
void Multi(int cost,int num) //多重背包
{
if(cost*num>cash)
Comple(cost);
else
{
int i=1;
while(i
Zeroone(i*cost);
num-=i;
i*=2; //可以手工模擬算法運行加強理解
}
Zeroone(cost*num);
}
}
int main()
{
int i,j,k,n;
int cost[1005];
int num[1005];
while(scanf(%d,&cash)!=EOF)
{
scanf(%d,&n);
memset(f,0,sizeof(f));
for(i=0;i
for(i=0;i
printf(%d ,f[cash]);
}
return 0;
}