编程语言:Java
题目链接:http://poj.org/problem?id=1742
题解:dp数组表示可以达到的金额,dpc数组用来记录每次已经用掉的该金额的张数
结果:AC
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(new BufferedInputStream(System.in));
static int[] dp=new int[100002];
static int[] dpc=new int[100002];
public static void main(String[] args) throws IOException {
for(;;){
int n=sc.nextInt();
int m=sc.nextInt();
if(n==0&&m==0)break;
int[] values=new int[n];
int[] num=new int[n];
for (int i = 0; i < n; i++) {
values[i]=sc.nextInt();
}
for (int i = 0; i < n; i++) {
num[i]=sc.nextInt();
}
int ans=0;
Arrays.fill(dp,0);
dp[0]=1;
for(int i=0;i<n;i++){
Arrays.fill(dpc,0);
for(int j=values[i];j<=m;j++){
if(dp[j]==0&&dp[j-values[i]]!=0&&dpc[j-values[i]]<num[i]){
ans++;
dpc[j]=dpc[j-values[i]]+1;
dp[j]=1;
}
}
}
out.println(ans);
}
out.flush();
}
}