题目:
链接:点击打开链接
题意:
武汉大学有很多漂亮的妹纸,,,,,,,他们有一块待剪的布,他们想把它剪成很多小块做围巾,每个人喜欢不同的风格,他们把每一块的价值写在了纸上,现在有一个机器,可以把一块布剪成两块矩形的布,要求你用这台机器把原始的大布剪成纸上出现的小布,他们希望的到小块布的价值最大,当然不要求用完所有的布。。
思路:
首先它是一个背包问题:1>大布尺寸是总容量,每个小布都有相应的费用,2>要求剪的小布的个数是不限的,3>每块小布都有价值,要求大布被裁剪后的最大价值,(完全背包中的背包的最大价值)。
max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].c//a[k].c是当前块的价值, max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))//剩余块的的最大价值
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; struct node { int x; int y; int c; }a[11]; int dp[1005][1005]; int main() { int N,X,Y,t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&N,&X,&Y); for(int i=0; i<N; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c); for(int i=1; i<=X; i++) { for(int j=1; j<=Y; j++) { for(int k=0; k<N; k++) { if(i>=a[k].x && j>=a[k].y)//分两种情况, dp[i][j] = max(dp[i][j],max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),(dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].c); if(i>=a[k].y && j>=a[k].x) dp[i][j] = max(dp[i][j],max((dp[i-a[k].y][j]+dp[a[k].y][j-a[k].x]),(dp[i][j-a[k].x]+dp[i-a[k].y][a[k].x]))+a[k].c); } } } printf("%d\n",dp[X][Y]); } return 0; }
------------------------------------------------------------------------------------
看了大牛的代码和讲解点击打开链接
------------------------------------------------------------------------------------
hdu 3127 WHUgirls
时间: 2024-11-03 22:04:41