傳送門
在遙遠的東方,有一家糖果專賣店。
這家糖果店將會在每天**一些糖果,它每天都會生產出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 這樣的...