码迷,mamicode.com
首页 > 其他好文 > 详细

hdu3127

时间:2015-02-13 22:20:48      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?

此题:布条长宽即为容量,特定布条有相应价值,求最大价值——背包问题——物品不限个数——完全背包问题。

背包问题同多数动态规划问题一样,最重要的是推出状态转移方程——

一、确定问题的决策对象
二、对决策对象划分阶段——d[i][j]表示长i宽j的布条能取得的价值
三、对各阶段确定状态变量
四、根据状态变量确定费用函数和目标函数
五、建立各阶段的状态变量的转移方程,写出状态转移方程
布条有长宽,使用二维数组
1、布条长宽不固定2、大布条减去小布条后剩下的布不一定是矩形。得到两个状态方程:
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].v);
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].v);
技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node
 6 {
 7     int x,y,v;
 8 }a[20];
 9 int dp[1005][1005];
10 int main()
11 {
12     int i,j,k,n,X,Y,t;
13     scanf("%d",&t);
14     while(t--)
15     {
16         scanf("%d%d%d",&n,&X,&Y);
17         for(i=0;i<n;i++)
18         scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
19         memset(dp,0,sizeof(dp));
20         for(i=0;i<=X;i++)
21         {
22             for(j=0;j<=Y;j++)
23             {
24                 for(k=0;k<n;k++)
25                 {
26                     if(i>=a[k].x&&j>=a[k].y)
27                     dp[i][j]=max(dp[i][j],max((dp[i-a[k].x][j]+dp[a[k].x][j-a[k].y]),
28                     (dp[i][j-a[k].y]+dp[i-a[k].x][a[k].y]))+a[k].v);
29                     if(i>=a[k].y&&j>=a[k].x)
30                     dp[i][j]=max(dp[i][j],max((dp[i-a[k].y][j]+dp[a[k].y][j-a[k].x]),
31                     (dp[i][j-a[k].x]+dp[i-a[k].y][a[k].x]))+a[k].v);
32                 }
33             }
34         }
35         printf("%d\n",dp[X][Y]);
36     }
37     return 0;
38 }
View Code

 

hdu3127

标签:

原文地址:http://www.cnblogs.com/KIKIKS/p/4290934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!