HDU3535分组背包
来源:互联网 发布:图片制作软件下载 编辑:程序博客网 时间:2024/05/16 17:20
首先这个 是我参考别人的思路后写出来的,一开始误以为是混合背包,
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<cmath>#include<memory.h>using namespace std;int dp[102][102];void clear(){memset(dp,0,sizeof(dp));}int main(){int n,t;int m,type;int c,g;while(cin>>n>>t){clear();for(int i=1;i<=n;i++){scanf("%d %d",&m,&type);if(type==0)for(int l=0;l<=t;l++)dp[i][l]=-1;//不选就为-1elsefor(int l=0;l<=t;l++)dp[i][l]=dp[i-1][l];//传递背包的值for(int j=1;j<=m;j++){scanf("%d %d",&c,&g);for(int k=t;k>=c;k--){if(type==0)//必须一种,传递关系中不能有 (向下传且出现不选)的现象{if(dp[i][k-c]!=-1)dp[i][k]=max(dp[i][k],dp[i][k-c]+g);if(dp[i-1][k-c]!=-1)dp[i][k]=max(dp[i][k],dp[i-1][k-c]+g);}if(type==1)//至多一种,传递关系中不能有(有随意选并且有随意选)的现象{if(dp[i-1][k]!=-1)dp[i][k]=max(dp[i][k],dp[i-1][k]);if(dp[i-1][k-c]!=-1)dp[i][k]=max(dp[i][k],dp[i-1][k-c]+g);}if(type==2)//随意{if(dp[i-1][k]!=-1)dp[i][k]=max(dp[i][k],dp[i-1][k]);if(dp[i][k-c]!=-1)dp[i][k]=max(dp[i][k],dp[i][k-c]+g);if(dp[i-1][k-c]!=-1)dp[i][k]=max(dp[i][k],dp[i-1][k-c]+g);}}}}cout<<dp[n][t]<<endl;}}
接下来这个是我参考思路的那个代码,自认为 大神的代码比我的好理解多了
#include<iostream> #include<cstdio> #include<algorithm> #include<memory.h> using namespace std; int dp[125][125],n,m; struct node { int sum; int Typ; int c[125]; int g[125]; } p[125]; int main() { //int i,j,t,k; while(scanf("%d%d",&n,&m)==2) { memset(dp,-1,sizeof(dp)); memset(dp[0],0,sizeof(dp[0])); for(int i=1; i<=n; i++) { cin>>p[i].sum>>p[i].Typ; for(int j=1; j<=p[i].sum; j++) { cin>>p[i].c[j]>>p[i].g[j]; } } for( int i = 1 ; i <= n ; i ++ ) { if(p[i].Typ==0) { for( int j = 1 ; j<=p[i].sum; j++ ) for( int k = m ; k >= p[i].c[j] ; k-- ) { if( dp[i][k-p[i].c[j]]!=-1 ) dp[i][k] = max(dp[i][k],dp[i][k-p[i].c[j]]+p[i].g[j]); if( dp[i-1][k-p[i].c[j]]!=-1 ) dp[i][k] = max(dp[i][k],dp[i-1][k-p[i].c[j]]+p[i].g[j]); } } if(p[i].Typ==1) { for(int j=0;j<=m;j++) dp[i][j] = max(dp[i-1][j],dp[i][j]); for( int j = 1 ; j <= p[i].sum; j++ ) for( int k = m ; k >= p[i].c[j]; k-- ) { if(dp[i-1][k-p[i].c[j]] != -1 ) dp[i][k] = max(dp[i][k],dp[i-1][k-p[i].c[j]]+p[i].g[j]); } } if(p[i].Typ==2) { for( int j = 0 ; j <= m ; j++) { dp[i][j] = dp[i-1][j]; } for( int j = 1 ; j <=p[i].sum; j++ ) for( int k = m ; k >= p[i].c[j] ; k-- ) { if(dp[i-1][k-p[i].c[j]] != -1 ) dp[i][k] = max(dp[i][k],dp[i][k-p[i].c[j]]+p[i].g[j]); } } } cout<<dp[n][m]<<endl; } return 0; }
- hdu3535 01&分组背包
- HDU3535分组背包
- HDU3535 AreYouBusy 混合分组背包
- hdu3535 分组背包的研究
- hdu3535---AreYouBusy(混合分组背包,有坑点)
- HDU3535 - AreYouBusy(混合背包+两种分组背包)
- hdu3535(01背包)
- hdu3535 AreYouBusy (混合背包)
- hdu3535分组背包 必须选一次,最多选一次,不限制
- hdu3535
- 分组背包
- 分组 背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 如何制作和部署war包
- VC6.0中,创建、调用 dll
- 两种DMA触发方式的传输过程
- 【OpenCV】图像几何变换:旋转,缩放,斜切
- Android发送和接收自定义Broadcast
- HDU3535分组背包
- CXF+Spring+Tomcat简明示例
- wifi的设计
- 什么是架构
- yuv序列转avi源代码
- 常用快捷键 vs2005 + sqlserver2005
- 实现函数atoi和itoa
- JAVA中synchronized和lock详解
- Google + SEO