要求
有n种不同大小的数字
ai
,每种个
mi
个。判断是否可以从这些数字之中选出若干使他们的和恰好为K。
限制条件
(1 <= n <= 100)(1 <=
ai
,
mi
<= 100000)(1 <= K <= 100000)
输入格式
第一行输入n 接下来n行输入ai,mi 最后一行输入K
输出格式
如果有,则输出YES, 如果无,则输出NO
测试输入
3 3 3 5 2 8 2 17
测试输出
YES
解题思路
使用dp数组来存剩余数量个数,下标用来记录当前和。
代码
#include <iostream>
#include <cstring>
using namespace std;
int dp[
100001];
int main() {
int n;
cin >> n;
int a[
101],m[
101];
for (
int i =
0; i < n; i++) {
cin >> a[i] >> m[i];
}
int K;
cin >> K;
memset(dp, -
1,
sizeof(dp));
dp[
0] =
0;
for (
int i =
0; i < n; i++) {
for (
int j =
0; j <=K; j++) {
if (dp[j] >=
0) {
dp[j] = m[i];
}
else if (j < a[i] || dp[j - a[i]] <=
0) {
dp[j] = -
1;
}
else {
dp[j] = dp[j - a[i]] -
1;
}
}
}
if (dp[K] >=
0) {
cout <<
"YES" << endl;
}
else {
cout <<
"NO" << endl;
}
return 0;
}