题意:给你n种面值的硬币,面值为a1…an,数量分别为c1…cn,求问,在这些硬币的组合下,能够多少种面值,该面值不超过m
然后代码是这样的
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#include <stdlib.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[1111], c[1111], dp[1111111],s[1111111];
int n, m,ans;
int main() {
while (scanf("%d%d", &n, &m), n != 0) {
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &c[i]);
}
ms(dp, -1);
for (int i = 0; i < n; i++) {
dp[0] = 1;
for (int j = 0; j <= m; j++) {
if (dp[j] > 0) {
dp[j] = 1;
s[j] = c[i];
}
else if (j >= a[i] && dp[j - a[i]] > 0 && s[j - a[i]] > 0) {
dp[j] = 1;
s[j] = s[j - a[i]] - 1;
}
}
}
ans = 0;
for (int i = 1; i <= m; i++) {
if (dp[i] > 0) ans++;
}
printf("%d\n", ans);
}
return 0;
}
然后可以发现,dp数组和s数组可以合并,稍微化简一下
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#include <stdlib.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[1111], c[1111], dp[1111111],s[1111111];
int n, m,ans;
int main() {
while (scanf("%d%d", &n, &m), n != 0) {
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++) scanf("%d", &c[i]);
ms(dp, -1);
for (int i = 0; i < n; i++) {
dp[0] = 1;
for (int j = 0; j <= m; j++)
if (dp[j] >= 0) dp[j] = c[i];
else if (j >= a[i]) dp[j] = dp[j - a[i]] - 1;
}
ans = 0;
for (int i = 1; i <= m; i++) if (dp[i] >= 0) ans++;
printf("%d\n", ans);
}
return 0;
}