poj 1742 Coins

时间:2023-03-09 04:21:32
poj 1742 Coins
// v给出N种硬币和个数,问可以取到1->M中的多少个值。
// 背包 完全背包 或多 重背包(二进制优化)都可以做
//
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 100010
int dp[maxn],use[maxn];
int val[],num[];
int main(){ int n,m;
dp[]=;
while(scanf("%d %d",&n,&m),n|m){
int i,j,k;
for(i=;i<=n;i++)
scanf("%d",&val[i]);
for(i=;i<=n;i++)
scanf("%d",&num[i]);
for(i=;i<=m;i++) dp[i]=; for(i=;i<=n;i++){
for(j=;j<=m;j++)
use[j]=;
for(j=val[i];j<=m;j++)
if(dp[j-val[i]]&&!dp[j]&&use[j-val[i]]+<=num[i]){
dp[j]=;
use[j]=use[j-val[i]]+;;
}
}
int ans=;
for(i=;i<=m;i++)
if(dp[i])
ans++;
printf("%d\n",ans);
} }