2017日照夏令營 day5 t1 backpack

題目描述
Blice和阿強巴是好朋友
但萌萌噠Blice不擅長數學,所以阿強巴給了她一些奶牛做練習
阿強巴有 頭奶牛,每頭奶牛每天可以產一定量的奶,同時也需要一定量的草作爲飼料
對於第 頭奶牛來說,它每天可以產 升的奶,同時需要 千克的草作爲飼料
現在來自蚯蚓國的九條可憐想借一些奶牛,使借走的這些奶牛每天的總產奶量最大,但九條可憐很窮,每天最多隻能提供
千克的草作爲飼料,而且她還需要對付跳蚤國的神刀手,所以她把這個問題交給了阿強巴,不不不……阿強巴覺得這個
問題太簡單了,所以把這個問題交給了你
輸入格式
第一行兩個整數 ,表示奶牛的數量和每天最多能提供的草
接下來 行,每行兩個整數,第 行表示第 頭奶牛的產奶量 和食量
輸出格式
僅一行,輸出一個整數,表示每天最大的總產奶量
輸入樣例
8 40
10 9
12 11
11 12
10 10
8 11
7 9
8 10
9 10
輸出樣例
41
限制與約定
對於 的數據,
另有 的數據,
另有 的數據,
對於 的數據,
對於所有數據,均滿足特殊限制:
n
i vi wi
W
n,W
n i i vi wi
20% n ≤ 10
30% W ≤ 10000
10% wi = w1
100% 1 ≤ n ≤ 100,1 ≤ wi,W ≤ 109
,1 ≤ vi ≤ 10
7
w1 ≤ wi ≤ w1 + 3

一看便是01揹包的題目,但是題中W會很大,普通的揹包肯定不行了,但是
觀察到wi的變化不超過3
令base=w1,然後把所有的wi減去base
設計狀態f[i][j][k]表示DP到第i個奶牛時,選了j個奶牛,這j個奶牛(減去base之後的)w_i的和爲k
就是對01揹包簡單做一下變形
時間複雜度O(n^3),空間複雜度O(n^3)或O(n^2)
第一維可以優化,不過對時間複雜度沒有影響

記憶化搜索

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,lim;
int f[105][105][305],w[105],v[105];
char vis[105][105][305];
int dp(int i,int j,int k)
{
    if (1LL*j*lim+k>m) return -2e9;//如果k>m-j*lim顯然是超過揹包容量的。捨去
    if (i==n) return 0;
    if (f[i][j][k]) return f[i][j][k];//記憶化搜索
    return f[i][j][k]=max(dp(i+1,j,k),dp(i+1,j+1,k+w[i+1])+v[i+1]);
}
main()
{
    //freopen("backpack.in","r",stdin);
    //freopen("backpack.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i) scanf("%d%d",v+i,w+i);
    lim=w[1];
    for (int i=1;i<=n;++i) w[i]-=lim;
    printf("%d\n",dp(0,0,0));
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章