購物(動態規劃)

2021-10-08 21:59:30 字數 1345 閱讀 3258

傳送門

在遙遠的東方,有一家糖果專賣店。

這家糖果店將會在每天**一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果**為c[i][j]元。

現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。(因為最多隻生產m個)買來糖果以後,你可以選擇吃掉糖果或者留著之後再吃。糖果不會過期,你需要保證這n天中每天你都能吃到至少乙個糖果。

這家店的老闆看你經常去光顧這家店,感到非常生氣。(因為他不能好好睡覺了)於是他會額外的要求你支付點錢。具體來說,你在某一天購買了 k 個糖果,那麼你在這一天需要額外支付 k2 的費用。

那麼問題來了,你最少需要多少錢才能達成自己的目的呢?

輸入描述:

第一行兩個正整數n和m,分別表示天數以及糖果店每天生產的糖果數量。

接下來n行(第2行到第n+1行),每行m個正整數,第x+1行的第y個正整數表示第x天的第y個糖果的費用。

輸出描述:

輸出只有乙個正整數,表示你需要支付的最小費用。

示例1輸入

複製3 2

1 1100 100

10000 10000

輸出複製

107思路:首先貪心思想排序,預處理每天夠用h個糖果的最小值,後面類似揹包問題,dp[i][j]表示前i天買了j個糖果的最小值,其中要注意第i天必須有i個糖果,因為每天都要吃乙個。

dp[i][j]=min(dp[i][j],dp[i-1][j-k]+sum[i][k]+k*k);

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

305;

ll a[maxn]

;ll sum[maxn]

[maxn]

;ll dp[maxn]

[maxn]

;int n,m;

intmain()

sort

(a+1

,a+1

+m);

for(

int j=

1;j<=m;j++)}

memset

(dp,

0x3f

,sizeof

(dp));

dp[0]

[0]=

0;ll ans=

1e9;

for(

int i=

1;i<=n;i++)}

ans=

min(ans,dp[i]

[n]);}

cout<}

動態規劃 RQNOJ 購物問題

由於換季,商場推出優惠活動,以超低 若干種商品。但是商場為避免過分虧本,規定某些商品不能同時購買,而且每種超低價商品只能買一件。身為顧客的你想獲得最大的實惠,也就是爭取節省最多的錢。經過仔細研究,我們發現商場 的超低價商品中,不存在以下這種情況 n n 3 種商品c1,c2,c3,cn,其中ci和c...

動態規劃 01揹包 超市購物

這種比較特殊的01揹包 01揹包 01揹包 還是沒有做到過唉。這道題我們觀察資料,發現v iv i vi 的具體數字很小,但是揹包的花費卻很大,我們可以考慮用另外一張方式進行揹包 用價值作為狀態,用花費作為具體的dpdp dp值進行計算。求在體積限制為代價最大,等價於在相同的價值 積最小 即用最小的...

演算法 動態規劃之購物單

分析和思路 把附件1和附件2輸入後,然後用 只買主件 只買主件 附件1 只買主件 附件2 買主件 附件1 附件2 實際歸為了新的產品種類。然後建立狀態轉移方程即可。詳細 如下 在狀態轉移時如何判斷這個主件有幾個附件?答案是不需要判斷,直接用 if j zj i if j zj i fj1 i 這樣的...