Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 41207 | Accepted: 13956 |
Description
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input
Output
Sample Input
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4
Source
题意:
先输入输入每种硬币的价值,再输入每种硬币的个数
求在m以内能组成几种价值
题解:多重背包问题,可以参考《挑战程序设计竞赛》P63
ac代码:
//
// main.cpp
// Coins POJ - 1742
//
// Created by Apple on 2018/3/23.
// Copyright © 2018年 Apple. All rights reserved.
//
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int a[100010];
int b[100010];
int dp[maxn];
int n,m;
void solve()
{
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<=m;j++)
{
if(dp[j]>=0)
dp[j]=b[i];
else if(j<a[i]||dp[j-a[i]]<=0)
dp[j]=-1;
else
dp[j]=dp[j-a[i]]-1;
}
}
int ans = 0;
for(int i = 1; i <= m; i++)
if(dp[i]>=0) ans++;
printf("%d\n", ans);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
solve();
}
}