程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3535 AreYouBusy

HDU 3535 AreYouBusy

編輯:C++入門知識

HDU 3535 AreYouBusy


分組背包

最多取一個的組,則對於該組來說,每一個狀態只可能由前一組的狀態過來,分不取和取兩種

至少取一個,則沒了不取的選擇,即沒有dp[i][j]=dp[i-1][j]的遞推式

任意取,即01背包,取法包括由前一組不取或取一個,或由該組取一個

dp[i][j]表示前i組,消耗j時間所能取得的最大值

初值賦為-1,表示該狀態不可達,對於dp[0],初值賦為0,即什麼都沒有的時候最大的快樂值為0

還有一個要注意的點c[k]可能為0,會影響到遞推式的順序

 

發現做這種混合背包的題非常有助於弄清楚各種背包間的區別和聯系

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define out(x) cout<<#x<<": "<>1;
typedef long long ll;
int c[maxn],g[maxn],dp[maxn][maxn];
int main() {
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int n,t,m,s;
	while(scanf("%d%d",&n,&t)!=EOF){
        memset(dp,-1,sizeof(dp));
        memset(dp[0],0,sizeof(dp[0]));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&m,&s);
            for(int j=1;j<=m;j++) {
                scanf("%d%d",&c[j],&g[j]);
            }
            if(s==0){
				for(int k=1;k<=m;k++){
					for(int j=t;j>=c[k];j--){
						if(dp[i][j-c[k]]!=-1) dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);//注意c[k]可能為0,所以這兩句不能交換順序,要不然dp[i][j-c[k]]的值就被改變了 
						if(dp[i-1][j-c[k]]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);
					}
				}
            }
            else if(s==1){
            	for(int j=0;j<=t;j++) dp[i][j]=dp[i-1][j];
            	for(int k=1;k<=m;k++){
					for(int j=t;j>=c[k];j--){
						if(dp[i-1][j-c[k]]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);
					}
				}
            }
            else {
            	for(int j=0;j<=t;j++) dp[i][j]=dp[i-1][j];
            	for(int k=1;k<=m;k++){
					for(int j=t;j>=c[k];j--){
						if(dp[i][j-c[k]]!=-1) dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);
					}
				}
            }
        }
        int ans=-1;
       	for(int i=0;i<=t;i++) ans=max(ans,dp[n][i]);
        printf("%d\n",ans);
	}
	
	return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved