chat 簡單揹包

2021-09-21 18:43:12 字數 1494 閱讀 1194

第一行乙個數字t(1≤t≤30)t(1≤t≤30)--樣例個數。

每個樣例第一行三個數字n,m,k(1≤n,m≤200,0≤k≤200)n,m,k(1≤n,m≤200,0≤k≤200)。

然後這n行,每行乙個長度為m的只含'0'和'1'的字串,

保證所有樣例中∑n×m∑n×m不超過5×1055×105。

每個樣例輸出一行乙個數字--casya在這n天中最小的總上線時間
示例1

2  

2 5 1

01001

10110

2 5 0

01001

10110

5

8

第乙個樣例:

一種可行的方案:

casya第一天在第1、2、3、4個小時上線。

casya的總上線時間是1+4=5。

第二個樣例:

只能老老實實上線。

casya第一天在第2、3、4、5個小時上線;

casya第一天在第1、2、3、4個小時上線。

casya的總上線時間是4+4=8。

解析:

將該題轉化為揹包來做,

產生至多k點生氣值,求最小消耗的小時數目

計算每組產生i點生氣值的最大小時數

直接暴力迴圈計算和女神一起玩i小時需要的時間,反轉一下就是產生的生氣值的時間

然後直接簡單dp計算p以內生氣值消耗的小時,遍歷取最小值,總複雜度o(n*m*m+n*m*p)

ac:

#include#define inf 0x3f3f3f3f

#define maxn 205

using namespace std;

char str[maxn];

int cc[maxn];

int dd[maxn][maxn];//dd[i][j],i組價值j的需要的體積

int ee[maxn][maxn];//丟掉

int vc[maxn];//記錄容量

int dp[maxn][maxn];//揹包

int main()

for(int j=1;j<=m;j++)

for(int k=1;k<=m;k++)

if(cc[k]>cc[j-1])

dd[i][cc[k]-cc[j-1]]=min(dd[i][cc[k]-cc[j-1]],k-j+1);

for(int j=1;j<=m;j++)

}for(int j=0;j<=vc[i];j++)

ee[i][j]=dd[i][vc[i]-j];

}dp[0][0]=0;

for(int i=1;i<=n;i++)}}

int ans=1e9;

for(int i=0;i<=p;i++)

ans=min(ans,dp[n][i]);

printf("%d\n",ans);

}return 0;

}

簡單01揹包 完全揹包

01揹包問題 有n個重量和價值分別為wi,vi的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。1 n 100 1 wi,vi 100 1 w 10000 第一行輸入n的值 接下來n行輸入wi,vi 最後一行輸入w for example input 2 31 2 3...

揹包九講 簡單揹包

揹包問題是一種動態規劃演算法的衍生問題。它可以被看作一種獨立的題型,也可以看作是一種線性動態規劃。學好揹包 學會揹包,對於深入理解動態規劃演算法有著極大的好處,並能幫助理解一些更深層次的動態規劃問題。那麼就開始吧 題目型別 有 n 件物品和乙個容量為 v 的揹包。第 i 件物品的費體積是 v i 價...

簡單0 1揹包

第一次部落格求不噴不噴不噴!有乙個容量為v的揹包,要裝進n個物品,第i個物品的費用為ci,價值為wi,要怎樣選擇才可以使花費不超過揹包容量的同時包裡的總價值最大?每個物品只能放一次 當時剛接觸c 的我剛拿到題目就蒙逼了 如果乙個乙個列舉的話有很多種組合,想想心都累。所以就要利用動態規劃思想。什麼是動...