mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
89 lines
3.1 KiB
C++
89 lines
3.1 KiB
C++
|
|
|||
|
#include <vector>
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <iostream>
|
|||
|
#include <algorithm>
|
|||
|
using namespace std;
|
|||
|
int dp[505][55][2];
|
|||
|
struct node{
|
|||
|
int v,w;
|
|||
|
};
|
|||
|
int main(){
|
|||
|
int V1,V2,i,j,a,b,c,k,n,ans,cas,sum,pre,sign;
|
|||
|
cas=1; //二维带限制条件的01背包
|
|||
|
while(scanf("%d%d%d",&V1,&V2,&n)!=EOF&&(V1||V2||n)){
|
|||
|
vector<node> G[2]; //dp[i][j][0]代表容量是i和j,没有用免费机会时的最大值
|
|||
|
memset(dp,-1,sizeof(dp)); //dp[i][j][0]代表容量是i和j,用免费机会时的最大值
|
|||
|
for(i=0;i<n;i++){
|
|||
|
scanf("%d%d%d",&a,&b,&c);
|
|||
|
G[c].push_back((node){a,b});
|
|||
|
}
|
|||
|
sum=dp[0][0][0]=0;
|
|||
|
for(i=0;i<G[1].size();i++){
|
|||
|
pre=sum; //只有前一个的值是pre才能
|
|||
|
sum+=G[1][i].w; //继续往里装
|
|||
|
for(j=V1;j>=0;j--){
|
|||
|
for(k=V2;k>=0;k--){
|
|||
|
if(dp[j][k][0]==pre)
|
|||
|
dp[j][k][1]=sum;
|
|||
|
if(j>=G[1][i].v){
|
|||
|
if(dp[j-G[1][i].v][k][1]==pre)
|
|||
|
dp[j][k][1]=sum;
|
|||
|
if(dp[j-G[1][i].v][k][0]==pre)
|
|||
|
dp[j][k][0]=sum;
|
|||
|
}
|
|||
|
if(k>=G[1][i].v){
|
|||
|
if(dp[j][k-G[1][i].v][1]==pre)
|
|||
|
dp[j][k][1]=sum;
|
|||
|
if(dp[j][k-G[1][i].v][0]==pre)
|
|||
|
dp[j][k][0]=sum;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
sign=0;
|
|||
|
for(i=0;i<=V1;i++)
|
|||
|
for(j=0;j<=V2;j++)
|
|||
|
for(k=0;k<=1;k++){
|
|||
|
if(dp[i][j][k]!=sum)
|
|||
|
dp[i][j][k]=-1;
|
|||
|
else
|
|||
|
sign=1;
|
|||
|
}
|
|||
|
if(!sign){
|
|||
|
printf("Case %d: -1\n\n",cas++);
|
|||
|
continue;
|
|||
|
} //看是否能装满特殊物品
|
|||
|
for(i=0;i<G[0].size();i++){
|
|||
|
for(j=V1;j>=0;j--){
|
|||
|
for(k=V2;k>=0;k--){
|
|||
|
if(dp[j][k][0]!=-1) //要放在最前面,避免了重复装入
|
|||
|
dp[j][k][1]=max(dp[j][k][1],dp[j][k][0]+G[0][i].w);
|
|||
|
if(j>=G[0][i].v){
|
|||
|
if(dp[j-G[0][i].v][k][1]!=-1)
|
|||
|
dp[j][k][1]=max(dp[j][k][1],dp[j-G[0][i].v][k][1]+G[0][i].w);
|
|||
|
if(dp[j-G[0][i].v][k][0]!=-1)
|
|||
|
dp[j][k][0]=max(dp[j][k][0],dp[j-G[0][i].v][k][0]+G[0][i].w);
|
|||
|
}
|
|||
|
if(k>=G[0][i].v){
|
|||
|
if(dp[j][k-G[0][i].v][1]!=-1)
|
|||
|
dp[j][k][1]=max(dp[j][k][1],dp[j][k-G[0][i].v][1]+G[0][i].w);
|
|||
|
if(dp[j][k-G[0][i].v][0]!=-1)
|
|||
|
dp[j][k][0]=max(dp[j][k][0],dp[j][k-G[0][i].v][0]+G[0][i].w);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
ans=0;
|
|||
|
for(i=0;i<=V1;i++)
|
|||
|
for(j=0;j<=V2;j++)
|
|||
|
for(k=0;k<=1;k++)
|
|||
|
ans=max(ans,dp[i][j][k]);
|
|||
|
printf("Case %d: %d\n\n",cas++,ans);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|