標籤:
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