多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > HDU 3535 AreYouBusy(混合背包)

HDU 3535 AreYouBusy(混合背包)

來源:程序員人生   發布時間:2014-11-07 08:57:46 閱讀次數:3043次

HDU3535 AreYouBusy(混合背包)

http://acm.hdu.edu.cn/showproblem.php?pid=3535

題意:

       給你n個工作集合,給你T的時間去做它們。給你m和s,說明這個工作集合有m件事可以做,它們是s類的工作集合(s=0,1,2s=0說明這m件事中最少得做1件,s=1說明這m件事中最多只能做1件,s=2說明這m件事你可以做也能夠不做)。再給你ci和gi代表你做這件事要用ci的時間,能取得gi的快樂值。求在T的時間內你能取得的最大快樂值。

分析:

       首先如果存在最優解, 我們可以互換不同工作集合的處理順序, 仍然能得到最優解. 那末我們下面只需要處理每一個單獨的工作集合便可.

       令dp[i][j]==x表示處理完前i組工作集,所花時間<=j時的快樂值為x。每得到1組工作就進行1次DP,所以dp[i]為第i組的結果。下面對3種情況進行討論。

       1.    該集合內最少要選1件工作時. 要保證最少選1個第i類工作, 可以從第i⑴類的結果dp[i⑴]來更新dp[i].也能夠用           01背包的思想, 從本類的前1個工作更新后1個工作.

       初始化:dp[i]全為負無窮.(即-INF)

       狀態轉移方程為:

       dp[i][k]=max{dp[i][k],dp[i⑴][k-cost[j]]+val[k],dp[i][k-cost[j]]+val[j] }

       2.    該集合內最多選1件工作時. 只能從上1層的結果dp[i⑴]來更新dp[i]了.(想一想為何)

       初始化:dp[i]==dp[i⑴].

       狀態轉移方程為dp[i][k]=max{dp[i][k],dp[i⑴][k-cost[j]]+val[k]}.

       3.    該集合內工作可以隨意選. 這就是1個普通的01背包問題了.

       初始化:dp[i]==dp[i⑴].

       狀態轉移方程為:

       dp[i][k]=max{dp[i][k],dp[i⑴][k-cost[j]]+val[k],dp[i][k-cost[j]]+val[j] }

 

       終究所求:dp[n][t]的值.

AC代碼:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100+5; #define INF 1e8 int n; int t; int dp[maxn][maxn]; int cost[maxn]; int val[maxn]; int main() { while(scanf("%d%d",&n,&t)==2) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { int m,s; scanf("%d%d",&m,&s); for(int k=1;k<=m;k++) scanf("%d%d",&cost[k],&val[k]); if(s==0)//最少選1個的01背包問題 { for(int j=0;j<=t;j++) dp[i][j]=-INF; for(int k=1;k<=m;k++) for(int j=t;j>=cost[k];j--) { dp[i][j] = max( dp[i][j] , dp[i][j-cost[k]]+val[k] ); //1 dp[i][j] = max( dp[i][j] , dp[i⑴][j-cost[k]]+val[k] );//2 //上面兩句順序互換就會出錯!為何? } } else if(s==1)//最多選1個的背包問題 { for(int j=0;j<=t;j++) dp[i][j]=dp[i⑴][j]; for(int k=1;k<=m;k++) for(int j=t;j>=cost[k];j--)//j可以正序或逆序枚舉 dp[i][j] = max( dp[i][j] , dp[i⑴][j-cost[k]]+val[k] ); } else if(s==2)//隨意選的01背包問題 { for(int j=0;j<=t;j++) dp[i][j]=dp[i⑴][j]; for(int k=1;k<=m;k++) for(int j=t;j>=cost[k];j--)//j只能逆序枚舉 dp[i][j] = max( dp[i][j] , dp[i][j-cost[k]]+val[k] ); } } int ans = max(dp[n][t],⑴); printf("%d ",ans); } return 0; }

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩欧美一区黑人vs日本人 | 欧美日韩一区二区在线视频播放 | 鲁在线| 国产精品极品美女自在线看免费一区二区 | 国产乱码亚洲精品一区二区 | 视频在线a| 免费欧洲毛片a级视频 | 国产在线观看中文字幕 | 在线观看亚洲 | 欧美国产亚洲一区二区三区 | 他添的我好湿好爽视频 | 亚洲第一色区 | 欧洲自拍偷拍 | 亚洲精品国产一区二区 | 久久久久国产一级毛片高清片 | 91嫩草国产在线观看免费 | 国产成人综合亚洲亚洲欧美 | 国产精品新婚门 | 色干综合| 亚洲区中文字幕 | 国产成人黄网址在线视频 | 国产成人一区二区在线不卡 | 亚洲日本韩国在线 | 国产精品国产午夜免费福利看 | 校园春色亚洲激情 | 一区二区亚洲精品 | 国产 日韩 欧美 亚洲 | 欧美视频日韩专区午夜 | 久久入 | 最近中文字幕mv免费看 | 欧美最猛性xxxxx(亚洲精品) | 手机在线完整视频免费观看 | 精品国产一区二区三区久久影院 | 欧美日韩专区 | 亚洲春色在线播放 | 亚洲成av人片在线观看无码 | 精品不卡一区中文字幕 | 在线观看av网站永久 | 亚洲高清免费在线观看 | 亚洲精品美女久久777777 | 亚洲欧美精品天堂久久综合一区 |