首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

HDU 1300 Pearls:動態規劃最小化採購成本

     編輯:C++ 入門

HDU 1300 Pearls:動態規劃最小化採購成本

題目大意:有 n 種珍珠,第 i 種需購買 num[i] 顆,單價 price[i]。採購規則:每次下單某種珍珠,數量必須在原需求基礎上 +10。可選擇用更高品質(更貴)珍珠替代低品質需求。求最小總成本。

解題思路:DP 優化採購批次

定義 dp[i] = 滿足前 i 種珍珠需求的最小成本。
狀態轉移:最後一批採購覆蓋第 j+1 到 i 種珍珠(j < i),全部按第 i 種(最高價)採購。
dp[i] = min_{0≤j
其中 sum[i] = Σ_{k=1..i} num[k] 為前綴和。
初始 dp[0] = 0,答案 dp[n]。

核心代碼

struct Pearl { int num, price; } p[105];
int dp[105], sum[105];

int main() {
    int T; scanf("%d", &T);
    while (T--) {
        int n; scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].num, &p[i].price);
        sum[0] = 0;
        for (int i = 1; i <= n; i++) sum[i] = sum[i-1] + p[i].num;
        memset(dp, 0x3f, sizeof(dp));
        dp[0] = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 0; j < i; j++)
                dp[i] = min(dp[i], dp[j] + (sum[i] - sum[j] + 10) * p[i].price);
        printf("%d\n", dp[n]);
    }
    return 0;
}

關鍵點

  • 前綴和優化區間求和。
  • DP 複雜度 O(n²),n ≤ 100 極快。
  • 體現「統一採購高檔替代低檔」可能更省錢的決策。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved