练习题 No.10 多重部分和问题

xiaoxiao2021-02-28  109

要求

有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; }
转载请注明原文地址: https://www.6miu.com/read-68955.html

最新回复(0)