Cash Machine
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 35336 Accepted: 12799
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,
N=3, n1=10, D1=100, n2=4, D2=50, n3=5, D3=10
means the machine has a supply of 10 bills of @100 each, 4 bills of @50 each, and 5 bills of @10 each.
Call cash the requested amount of cash the machine should deliver and write a program that computes the maximum amount of cash less than or equal to cash that can be effectively delivered according to the available bill supply of the machine.
Notes:
@ is the symbol of the currency delivered by the machine. For instance, @ may stand for dollar, euro, pound etc.
题解:
多重背包。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
struct node
{
int n,v;
}a[20];
const int N=100000+10;
int dp[N],maxn=0,tem,sum,n;
int main()
{
while(~scanf("%d%d",&sum,&n))
{
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].n,&a[i].v);
if (!sum||!n)
{
printf("0\n");
continue;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
maxn=0;
for(int i=1;i<=n;i++)
for(int j=maxn;j>=0;j--)
{
if(dp[j])
{
for (int k=1;k<=a[i].n;k++)
{
tem=j+k*a[i].v;
if(tem>sum) continue;
dp[tem]=1;
if (tem>maxn) maxn=tem;
}
}
}
printf("%d\n",maxn);
}
return 0;
}