dp[i][j]为用了前i种硬币,得到j,最多还剩下i种硬币多少个。 dp[n][x] >= 0说明可以达到x。
#include <cstdio>
#include <cstring>
const int maxn = 110;
const int maxm = 100010;
int a[maxn], b[maxn];
int dp[maxm];
int main()
{
int n, m;
while(scanf("%d %d", &n, &m) && (n+m))
{
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
scanf("%d", &b[i]);
memset(dp, -1, sizeof(dp));
dp[0] = true;
for(int i = 1; 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);
}
return 0;
}