1599: PIPI的数字游戏(PIPIPOJ)
题目描述
PIPI有n个数字,每个数字都可以重复选取。他想用这些数字累加出一个目标数m,请问他至少用多少个数字才能凑出m?如果无法凑出,输出-1。
输入
第一行输入T(1<=T<=100)表示测试样例个数。
对于每一组样例,第一行有两个整数n(1<=n<=500)和 m (1<=m<=1000)。
第二行包含n个整数,每个整数的值x满足(0<=x<=1000)。
输出
对于每组样例,输出最少需要的数字数量,不能凑出输出-1。
样例输入
2
3 6
1 2 3
2 3
2 4
样例输出
2
-1
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int t, n, m, dp[1010], nums[505];
int solve() {
memset(dp, 0x3f, sizeof dp); // dp[i]表示凑出数字i所需要的最少数字个数
dp[0] = 0; // 凑出数字0不需要任何数字
for (int i = 1; i <= m; ++i) {
for (int j = 0; j < n; ++j) {
if (i >= nums[j] && dp[i - nums[j]] != INF) {
dp[i] = min(dp[i], dp[i - nums[j]] + 1);
}
}
}
return dp[m] == INF ? -1 : dp[m];
}
int main() {
cin >> t;
while (t--) {
cin >> n >> m;
for (int i = 0; i < n; ++i) cin >> nums[i];
cout << solve() << endl;
}
return 0;
}