题意:给你一块X*Y的布,然后选做n个手帕,给你这n个手帕的长和块,做出每个手帕会获得相应的利润,问该怎样分配这块布,才能获得最大的利润。
http://www.cnblogs.com/feature/articles/1856555.html 图画的不错,很容易理解。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
using namespace std;
int dp[1100][1100];
struct node
{
int x,y;
int val;
}Node[24];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T;
int N,X,Y;
scanf("%d",&T);
while(T--)
{
memset(Node,0,sizeof(Node));
memset(dp,0,sizeof(dp));
scanf("%d%d%d",&N,&X,&Y);
for(int i=0; i<N; i++)
{
scanf("%d%d%d",&Node[i].x,&Node[i].y,&Node[i].val);
}
for(int i=1; i<=X; i++)
for(int j=1; j<=Y; j++)
for(int k=0; k<N; k++)
{
if(i>=Node[k].x && j>=Node[k].y)
dp[i][j]=max(dp[i][j],max((dp[i-Node[k].x][j]+dp[Node[k].x][j-Node[k].y]),(dp[i][j-Node[k].y]+dp[i-Node[k].x][Node[k].y]))+Node[k].val);
int ii=j;
int jj=i;
if(jj>=Node[k].y && ii>=Node[k].x)
dp[i][j]=max(dp[i][j],max((dp[i-Node[k].y][j]+dp[Node[k].y][j-Node[k].x]),(dp[i][j-Node[k].x]+dp[i-Node[k].y][Node[k].x]))+Node[k].val);
}
printf("%d\n",dp[X][Y]);
}
return 0;
}