D.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233
  1. //
  2. // Created by liuhuan on 18-11-7.
  3. //
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. #define LL long long int
  7. #define INF 0x3f3f3f3f
  8. int dp[20020];
  9. int main() {
  10. int n, m;
  11. cin >> n;
  12. int coins[n]; //硬币个数
  13. int T[n]; //硬币面值
  14. for (int i = 0; i < n; i++)
  15. cin >> T[i] >> coins[i];
  16. cin >> m;
  17. for (int i = 1; i <= m; i++) dp[i] = INF; //赋极大值,表示不可达
  18. for (int i = 0; i < n; i++) //遍历硬币种类
  19. for (int j = 1; j <= coins[i]; j++) //遍历硬币数量
  20. for (int k = m; k >= T[i]; k--) //此处较难理解
  21. //只能是由m到T[i]而不能相反
  22. //试想,初始态dp[k-T[i]]应当=INF,dp[0]=0
  23. //如果能组成m元的硬币,那么应当存在一条0->m的路径,此时
  24. //dp[m]就是需要的硬币数量
  25. //否则,dp[m]将不能链接到dp[0],从而dp[m]=INF输出-1
  26. dp[k] = min(dp[k], dp[k - T[i]] + 1);
  27. cout << (dp[m] < m ? dp[m] : -1) << endl;
  28. return 0;
  29. }