liuhuan %!s(int64=5) %!d(string=hai) anos
pai
achega
fd0b724b36
Modificáronse 2 ficheiros con 58 adicións e 0 borrados
  1. 34 0
      D.cpp
  2. 24 0
      E.cpp

+ 34 - 0
D.cpp

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

+ 24 - 0
E.cpp

@@ -0,0 +1,24 @@
+//
+// Created by liuhuan on 18-11-7.
+//
+#include <bits/stdc++.h>
+
+using namespace std;
+
+int main() {
+    for (int n; cin >> n;) {
+        vector<int> bombs(n);
+        for (size_t i = 0; i < n; i++)cin >> bombs[i];
+        vector<int> h(bombs.size(), 0);
+        h[0] = 1;
+        for (int i = 1; i < bombs.size(); i++) {
+            int max = 0;
+            for (int j = 0; j < i; j++)
+                if (bombs[j] >= bombs[i] && h[j] > max)max = h[j];
+            h[i] = max + 1;
+
+        }
+        cout << *max_element(h.begin(), h.end()) << endl;
+    }
+    return 0;
+}