辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」 如果你是辰辰,你能完成這個任務嗎?
輸入檔案的第一行包含兩個正整數n,m。m表示總共能夠用來採藥的時間,n代表山洞裡的草藥的數目。接下來的n行每行包括兩個的整數,分別表示採摘某株草藥的時間ti和這株草藥的價值vi。
輸出檔案僅包含乙個整數表示規定時間內可以採到的草藥的最大總價值。
50%的資料中 n,m ≤ 1000; 100%的資料中 n,m ≤ 100000,ti,vi ≤10
一眼看去是01揹包,然而n太大會爆
再看發現ti和vi不超過10,按費用分成10類做排序,就變成有10種物品的揹包
用陣列記錄狀態,順推一下就好了 f[
i+j]
=f[i
]+v[
j](0
≤j≤m
in(i
,10))
就這樣當然還有方法二
10*10種可能,也就是100種不同費用、不同價值的物品,有多個可以選擇
變成了多重揹包
再把多重揹包轉化成01揹包(汗),速度確實可以上來
#include
#include
#include
using
namespace
std;
int t[11][101001];
int b[100101][11];
int f[100101];
bool cmp(int x,int y)
int min(int x,int y)
for (int i=1;i<=10;i++)
sort(t[i]+1,t[i]+t[i][0]+1,cmp);
for (int i=0;i<=m;i++)}}
printf("%d\n",f[m]);
return
0;}
#include
using namespace std;
intmap[11][11];
int w[100001],v[100001],f[100001];
int max(int
x,int
y)int main()
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
if (o!=map[i][j])
}for (int i=1;i<=count;i++)
for (int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
printf("%d\n",f[m]);
return
0;}
區間 紀中1382 dp
alice收到一些很特別的生日禮物 區間。即使很無聊,alice還是能想出關於區間的很多遊戲,其中乙個是,alice從中選出最長的不同區間的序列,其中滿足每個區間必須在禮物中,另序列中每個區間必須包含下乙個區間。程式設計計算最長序列的長度。輸入檔案第一行包含乙個整數n 1 n 100000 表示區間...
跳舞 紀中2545 dp
小明今天得到乙個跳舞毯遊戲程式dance。遊戲每次連續出n 個移動的 箭頭 箭頭依次標號為1 到n,並且的相應的分數s 1.n 如果你能 踏中 第i 號箭頭,你將獲得相應的分數s i 否則將被扣除相應的分數。另外,遊戲還有乙個累計獎勵機制 如果踏準次數累計達到t,並且是在踏中第i個箭頭達到的,則將得...
書架 紀中2931 dp 堆
題目大意 當farmer john閒下來的時候,他喜歡坐下來讀一本好書。多年來,他已經收集了n本書 1 n 100,000 他想要建立乙個多層書架,來存放它們。每本書 i 擁有乙個寬度 w i 和乙個高度 h i 所有的書需要按順序,放到書架的每一層。舉例來說,第一層書架放k本書,應該放書1.k 第...