#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010
struct node{
int x,y,val;
}s[30];
int dp[N][N];
int main(){
int t,n,v1,v2;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&v1,&v2);
for(int i=0;i<n;i++){
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].val);
s[i+n].x=s[i].y;
s[i+n].y=s[i].x;
s[i+n].val=s[i].val;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<=v1;i++){
for(int j=0;j<=v2;j++){
for(int h=0;h<2*n;h++){
int u=s[h].x;
int v=s[h].y;
if(u<=i&&v<=j)
dp[i][j]=max(dp[i][j],max(dp[u][j-v]+dp[i-u][j],dp[i-u][v]+dp[i][j-v])+s[h].val);
}
}
}
printf("%d\n",dp[v1][v2]);
}
return 0;
}
题意很明确,就是完全背包,刚开始对于n的循环写在外面。。一直wrong,还有个问题就是一刀切的方式应该有两种!对于n这个循环为什么放里面:我刚开始写在外面,是根据二维背包的写法。。。其实这道题是三维的。。。。。
其实很好理解:两维才对应一个物品。。也就是说一个(x,y)才对应一个物品。。x,y是连在一起。。。。就是说选一个物品,x,y要同时改变。。