codevs2894、2837、1669、2503、3231

來源:互聯網
上載者:User

標籤:

6.25動態規劃之背包回顧

 

2894 Txx考試

 

 時間限制: 1 s 空間限制: 32000 KB 題目等級 : 黃金 Gold題解   題目描述  Description

Txx是一個成績很差的人,考試便成了他的噩夢。於是他常在考試時睡覺以打發時間。今天他又要面臨一次考試,為了保證有充足的睡眠,他決定只做k分鐘題目。這次測試有n道題,第i題的得分是pi分,需要耗費ti分鐘解決(將要完成也得不到分)。

請你算出他最少扣多少分(總分是所有題目分值的總和)。

輸入描述  Input Description

第一行k

第二行n

第三行到第n+2行每行兩個數:ti和pi

輸出描述  Output Description

Txx最少的扣分

範例輸入  Sample Input

5

3

2 6

1 3

4 7

 

範例輸出  Sample Output

6

 

資料範圍及提示  Data Size & Hint

100%的資料中,k<=100000,ti<=10000,pi<=10000;

30%的資料中,n<=20;

100%的資料中,n<=500

背包歸類:01背包

#include<cstdio>#include<iostream>using namespace std;#define N 101000int v[N],c[N],f[N],k,n,sum;int main(){    scanf("%d%d",&k,&n);    for(int i=1;i<=n;i++){        scanf("%d%d",v+i,c+i);        sum+=c[i];    }    for(int i=1;i<=n;i++){        for(int j=k;j>=v[i];j--){            f[j]=max(f[j],f[j-v[i]]+c[i]);        }    }    printf("%d\n",sum-f[k]);    return 0;}
2837 考前複習

 

 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold題解   題目描述  Description

Aiden馬上要考試了,可他還沒怎麼複習,於是他決定臨時抱佛腳。他列了N個知識點,並分析出了複習每個知識點所需的時間t以及可能獲得的分數k。他現在還有T時間來複習,他希望選擇正確的知識點來在最短的時間內獲得最高的期望分數。

輸入描述  Input Description

第一行,兩個數,分別為N、T。

接下來的N行,每行兩個數t、k,表示一個知識點所需的時間和期望得分。

輸出描述  Output Description

一行,一個數,表示可以獲得的最高期望得分。

範例輸入  Sample Input

3 5

3 5

3 2

2 2

範例輸出  Sample Output

7

資料範圍及提示  Data Size & Hint

對於10%的資料,0<N≤10,0<T≤100。

對於50%的資料,0<N≤1000,0<T≤10000。

對於100%的資料,0<N≤5000,0<T≤10000,0<t,k≤1000。

背包歸類:01背包

 

#include<cstdio>#include<iostream>using namespace std;#define N 101000int v[N],c[N],f[N],k,n;int main(){    scanf("%d%d",&n,&k);    for(int i=1;i<=n;i++){        scanf("%d%d",v+i,c+i);    }    for(int i=1;i<=n;i++){        for(int j=k;j>=v[i];j--){            f[j]=max(f[j],f[j-v[i]]+c[i]);        }    }    printf("%d\n",f[k]);    return 0;}
1669 運輸裝備

 

 時間限制: 1 s 空間限制: 256000 KB 題目等級 : 鑽石 Diamond題解   題目描述  Description

德國放鬆對英國的進攻後,把矛頭指向了東北——蘇聯。 1943年初,東線的站頭進行到白熱化階段。據可靠情報,90餘萬德國軍隊在庫爾斯克準備發動好大的攻勢。因此,朱可夫元帥要求你立即從遠東的軍工廠運輸大量裝備支援庫爾斯克前線。 列車司機告訴你,一趟列車最多可以容納V體積的武器裝備,但是你可能不能裝滿,因為列車承受不了那麼大的重量,一趟列車最多可以承載G單位的重量。同時,軍工廠倉庫提供給你一份裝備清單,詳細記錄了每件裝備的體積、重量和火力。為了有效支援朱可夫元帥,你要找到一種方案,使得總火力值最大。

輸入描述  Input Description

第一行:V和G表示最大重量和體積。 第二行:N表示倉庫有N件裝備; 第三到N+2行:每行3個數Ti  Vi  Gi表示個裝備的火力值、體積和重量;

輸出描述  Output Description

輸出一個數,表示可能獲得的最大火力值

範例輸入  Sample Input

6 5

4

10 2  2

20 3  2

40  4  3

30  3  3

範例輸出  Sample Output

50

資料範圍及提示  Data Size & Hint

【資料範圍】

對於50%的資料,V,G,N≤100

對於100%的資料,V,G,N≤1000

背包歸類:01背包

#include<cstdio>#include<iostream>using namespace std;#define N 1010int v[N],c[N],g[N],f[N][N],m,n,q;int main(){    scanf("%d%d%d",&n,&m,&q);    for(int i=1;i<=q;i++){        scanf("%d%d%d",c+i,v+i,g+i);    }    for(int i=1;i<=q;i++){        for(int j=v[i];j<=n;j++){            for(int k=g[i];k<=m;k++){                f[j][k]=max(f[j][k],f[j-v[i]][k-g[i]]+c[i]);            }        }    }    printf("%d\n",f[n][m]);    return 0;}
2503 失戀28天-縫補禮物

 

 時間限制: 1 s 空間限制: 32000 KB 題目等級 : 黃金 Gold題解   題目描述  Description

  話說上回他給女孩送了n件禮物,由於是廉價的所以全部都壞掉了,女孩很在意這些禮物,所以決定自己縫補,但是人生苦短啊,女孩時間有限,她總共有m分鐘能去縫補禮物。由於損壞程度不一樣所以縫補的時間p也是不一樣的,每件禮物呢,都有一個女孩的喜愛程度為w,後面還有一個數字h為這種禮物的件數。女孩想讓自己的喜愛程度的和最大,那麼請聰明的你幫她算一算!(注意:禮物非常多,不一定都能縫補完,女孩也不用把所有時間都花費)

輸入描述  Input Description

第1行2個整數 m,n
第2行到第n+1行 每行三個整數 p,w,h

輸出描述  Output Description

一個整數s表示最大的喜愛程度

範例輸入  Sample Input

8 2
2 100 4
4 100 2

範例輸出  Sample Output

400

 

資料範圍及提示  Data Size & Hint

m<=10000

n<=100

p,h,w<=6000

背包歸類:多重背包 樸素演算法
#include<cstdio>#include<iostream>using namespace std;#define N 10100int v[N],c[N],s[N],f[N],n,m;int main(){    scanf("%d%d",&m,&n);    for(int i=1;i<=n;i++){        scanf("%d%d%d",v+i,c+i,s+i);    }    for(int i=1;i<=n;i++){        for(int j=m;j>=0;j--){            for(int k=0;k<=s[i];k++){                if(j-k*v[i]<0) break;                f[j]=max(f[j],f[j-k*v[i]]+k*c[i]);            }        }    }    printf("%d\n",f[m]);    return 0;}

二進位最佳化

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;#define N 10010int e[30],v[N],c[N],f[N],m,n,n1;int main(){    for(int i=0;i<=28;i++) e[i]=1<<i;    scanf("%d%d",&m,&n);    for(int i=1,x,y,s;i<=n;i++){        scanf("%d%d%d",&x,&y,&s);        int t=0;        while(s>=e[t]){            v[++n1]=x*e[t];            c[n1]=y*e[t];            s-=e[t++];        }        if(s){            v[++n1]=x*s;            c[n1]=y*s;        }    }    for(int i=1;i<=n1;i++){        for(int j=m;j>=v[i];j--){            f[j]=max(f[j],f[j-v[i]]+c[i]);        }    }    printf("%d\n",f[m]);    return 0;}
3231 小吃

 

 時間限制: 1 s 空間限制: 16000 KB 題目等級 : 黃金 Gold題解   題目描述  Description

這裡簡直是吃貨的天堂,小吃太多了。數不勝數。

假設島上有N種小吃,每種體積Vi,美味度Wi。

設某吃貨旅行者的食量C,求他能吃到食品的最大美味度。

 

輸入描述  Input Description

兩個正整數N  C

N個正整數,Vi

N個正整數,Wi

輸出描述  Output Description

最大美味值

範例輸入  Sample Input

4 10

2 5 1 9

10 24 1 100

範例輸出  Sample Output

101

 

資料範圍及提示  Data Size & Hint

N<=100,C<=10000,Vi,Wi<=1000

可以DP,可以DFS

背包歸類:01背包

#include<cstdio>#include<iostream>using namespace std;#define N 10100int v[N],c[N],f[N],n,m;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++) scanf("%d",v+i);    for(int i=1;i<=n;i++) scanf("%d",c+i);    for(int i=1;i<=n;i++){        for(int j=m;j>=v[i];j--){            f[j]=max(f[j],f[j-v[i]]+c[i]);        }    }    printf("%d\n",f[m]);    return 0;}

 

codevs2894、2837、1669、2503、3231

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.