#include using namespace std; const int N = 15; const int INF = 0x3f3f3f3f; int a[N]; int b[100010]; // b[i]记忆化数组,记录走了i这些公里情况下,使用的最少钱数 /* 12 20 30 40 25 60 70 80 90 11 21 34 */ // m是剩余多少公里 sum已经花了多少钱 // int sum=dfs(int m) 要走m公里,最少需要多少钱=sum int dfs(int m) { // 要走m公里,最少需要花多少钱 if (b[m] > 0) // 如果记录过m公里最少需要花多少钱,那么直接拿来就用,如果没有计算过,那就开始算吧 return b[m]; if (m == 0) return 0; int res = INF; for (int i = 1; i <= min(m, 10); i++) res = min(res, dfs(m - i) + a[i]); // 答案记录上,省的再次计算 b[m] = res; return res; } int main() { for (int i = 1; i <= 10; i++) cin >> a[i]; int m; // 要走多少公里 cin >> m; // 递归 cout << dfs(m) << endl; return 0; }