1.開心的金明
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行」。今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5等:用整數1~5表示,第5等最重要。他還從網際網路上查到了每件物品的**(都是整數元)。他希望在不超過n元(可以等於n元)的前提下,使每件物品的**與重要度的乘積的總和最大。
設第j件物品的**為v[j],重要度為w[j],共選中了k件物品,編號依次為j1,j2,……,jk,則所求的總和為:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*為乘號)
請你幫助金明設計乙個滿足要求的購物單。
輸入格式:
輸入的第1行,為兩個正整數,用乙個空格隔開:
n m(其中n(<30000)表示總錢數,m(<25)為希望購買物品的個數。)
從第2行到第m+1行,第j行給出了編號為j-1的物品的基本資料,每行有2個非負整數
v p(其中v表示該物品的**(v<=10000),p表示該物品的重要度(1~5))
輸出格式:
輸出只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值(<100000000)。
輸入樣例:
1000 5800 2
400 5
300 5
400 3
200 2
輸出樣例:3900
演算法分析:這個題就是01揹包問題,這裡的總錢數相當於揹包總容量,物品**和重要度的乘積相當於揹包所盛東西的價值。
#includeusing namespace std;int n,m,p;
int v[100001],s[100001],f[100001];
int max(int x,int y)
for(int i=1;i<=m;i++)
cout<2.裝箱問題
有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30,每個物品有乙個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
輸入格式:
乙個整數,表示箱子容量
乙個整數,表示有n個物品
接下來n行,分別表示這n 個物品的各自體積
輸出格式:
乙個整數,表示箱子剩餘空間。
輸入樣例#1:2468
31279
7
輸出樣例#1:
0
分析:這道題的問法和之前見過的揹包問題不同,但是只是輸出的結果有點兒差別罷了,之前輸出的是最大價值,現在輸出的是總容量減去所盛物品的體積,其實質還是一樣的。
#includeusing namespace std;
int v,n;
int c[100001],f[100001];
int max(int x,int y)
{ if(x>v;
cin>>n;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++)
for(int j=v;j>=c[i];j--)
if(f[j-c[i]]+c[i]>f[j])
f[j]=f[j-c[i]]+c[i];
cout<
動態規劃學習日記(五)
12 3 10 r 1,2 min 2 0r 2,3 30 例6 租用遊艇問題 例 問題描述 長江遊艇俱樂部在長江上設定了n個遊艇出租站1,2,n.遊客可在這些遊艇出租站租用遊艇,並在下游的任何乙個遊艇出租站歸還遊艇.遊艇出租站i到出租站j之間的租金為r i,j 1 i演算法設計 對於給定的遊艇出租...
動態規劃經典五題
雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文。有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。轉移方程 dp i j max dp i 1 j dp i 1 j weight i ...
LeetCode刷題 動態規劃(五)
上一節總結了 0 1揹包,接著總結 完全揹包。在做題中總結套路,事半功倍!引入322,零錢兌換,medium 518,零錢兌換 medium 377,組合總和 medium 139,單詞拆分,medium 完全揹包問題總結 引入 完全揹包的變體問題 物品可以無限次選取,且考慮物品放入的順序。下面在具...