HIT 1942 D - OS进程调度
2017-04-29 09:31
190 查看
题目链接:
https://vjudge.net/contest/161075#problem/D题解:
一道变异的背包的题目,自己卡在了纪录结点的地方,最后,直接用了一个三维的队列才弄出来的 。(谨记)代码:
#include <cmath> #include <cstdio> #include <queue> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define met(a,b) memset(a,b,sizeof(a)) #define inf 0x3f3f3f3f const int maxn = 50+10; int dp[20][20][20]; struct node { int x,y,z; }num[maxn]; queue<int> q[20][20][20]; int main() { int x,y,z; while(scanf("%d%d%d",&x,&y,&z)!=EOF) { if(x==0&&y==0&&z==0) break; int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d%d",&num[i].x,&num[i].y,&num[i].z); met(dp,0); for(int i=0;i<=x;i++) for(int j=0;j<=y;j++) for(int k=0;k<=z;k++) while(!q[i][j][k].empty()) q[i][j][k].pop(); for(int i=0;i<n;i++) { for(int k1=x;k1>=num[i].x;k1--) { for(int k2=y;k2>=num[i].y;k2--) { for(int k3=z;k3>=num[i].z;k3--) { if(dp[k1][k2][k3]<=dp[k1-num[i].x][k2-num[i].y][k3-num[i].z]) { dp[k1][k2][k3]=dp[k1-num[i].x][k2-num[i].y][k3-num[i].z]+1; q[k1][k2][k3]=q[k1-num[i].x][k2-num[i].y][k3-num[i].z]; q[k1][k2][k3].push(i); } } } } } int ans=0; int x1=0,y1=0,z1=0; for(int i=1;i<=x;i++) for(int j=1;j<=y;j++) for(int k=1;k<=z;k++) { if(ans<dp[i][j][k]) { ans=dp[i][j][k]; x1=i; y1=j; z1=k; } } printf("%d\n",ans); while(!q[x1][y1][z1].empty()) { int xx=q[x1][y1][z1].front(); q[x1][y1][z1].pop(); printf("%d",xx+1); if(q[x1][y1][z1].size()!=0) printf(" "); else printf("\n"); } } }