UVA 12455 - Bars
題目:
我們有一些已知長度的金屬棒,請問可以找出所需的特定長度的金屬棒嗎?必要時,可以把幾根金屬棒焊接成更長的一根,但金屬棒不得切割。
Input
輸入的第一行含有一個整數 𝑡, 0 ≤ 𝑡 ≤ 50,表示測資的筆數。每筆測資三行,第一行有一個數字 𝑛, 0 ≤ 𝑛 ≤ 1000,表示我們所要的長度。第二行有一個數字 𝑝, 1 ≤ 𝑝 ≤ 20,表示我們所擁有的金屬棒的數量。第三行有 𝑝 個數字,表示 𝑝 根金屬棒的長度。
Output
每筆測資輸出一行,依是否可能成功輸出「YES」或「NO」字串。
Sample Input #1
4
25
4
10 12 5 7
925
10
45 15 120 500 235 58 6 12 175 70
120
5
25 25 25 25 25
0
2
13 567
Sample Output #1
NO
YES
NO
YES
C++ code:
**DP**
```c++=
#include <bits/stdc++.h>
using namespace std;
bool cmp(int n, vector<int> &len) {
int m = len.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
for (int i = 0; i <= m; ++i) {
dp[i][0] = true;
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = dp[i - 1][j];
if (j >= len[i - 1]) {
dp[i][j] = dp[i][j] || dp[i - 1][j - len[i - 1]];
}
}
}
return dp[m][n];
}
int main() {
int t;
cin >> t;
while (t--) {
int n, p;
cin >> n >> p;
vector<int> len(p);
for (int i = 0; i < p; ++i) {
cin >> len[i];
}
if (cmp(n, len)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
```