背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到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 }
原文:http://www.cnblogs.com/KIKIKS/p/4290934.html