poj 1948 Triangular Pastures
2011-06-18 17:58
393 查看
/* 解题报告:二维0-1背包 1、找状态为难点 2、设dp[i][j][k]为前i个木棍能够成长度为j,k的两边的三角形(1、第三边很容易求出来; 2、不考虑是否真的够成[仔细理解这句]) 3、状态转移移程为: dp[i][j][k] = dp[i-1][j][k] | dp[i][j-len[i]][k](j>=len[i]) | dp[i][j][k-len[i]](k>=len[i]) */ #include <iostream> #include <cstring> #include <cmath> using namespace std; bool dp[800][800]; int fences[40]; int n; int sum; int ans; int area(int a, int b, int c) { double p = (a+b+c)/2.0; return static_cast<int>(100 * sqrt(p * (p-a) * (p-b) * (p-c))); } int main() { int i, k, j; while(cin>>n) { sum = 0; for(i=0; i<n; ++i) { cin>>fences[i]; sum += fences[i]; } //二维0-1背包处理 memset(dp, 0, sizeof(dp)); dp[0][0] = true; int tempsum = sum; sum = sum>>1; for(i=0; i<n; ++i) { for(k=sum; k>=0; --k) { for(j=k; j>=0; --j) { if((dp[k-fences[i]][j]&&k>=fences[i]) || (dp[k][j-fences[i]]&&j>=fences[i])) dp[k][j] = true; } } } //取最大面积 int nMax = 0; ans = 0; for(i=sum; i>=0; --i) { for(j=i; j>=0; --j) { if(dp[i][j]) { int other = tempsum - i - j; if(i+j>other && i+other>j && other+j>i) { nMax = area(other, i, j); if(ans < nMax) ans = nMax; } } } } if(ans) cout<<ans<<endl; else cout<<-1<<endl; } return 0; }
相关文章推荐
- poj 1948 Triangular Pastures 二维01背包
- POJ 1948 Triangular Pastures 二维 0-1背包
- poj 1948 Triangular Pastures dp
- POJ 1948 Triangular Pastures 二维 0-1背包
- poj 1948 Triangular Pastures
- 所谓的二维背包Triangular Pastures POJ 1948
- poj 1948 Triangular Pastures 二维背包
- poj 1948 Triangular Pastures 01背包
- poj 1948 Triangular Pastures
- POJ 1948 Triangular Pastures【二维01背包】
- 背包问题--POJ 1948 Triangular Pastures[二维01背包]
- POJ 1948 Triangular Pastures 解题报告
- poj 1948 Triangular Pastures
- POJ 1948 Triangular Pastures
- POJ 1948 Triangular Pastures 【经典问题 - 二维01背包求最大三角形】
- poj 1948 Triangular Pastures 小结
- poj 1948 Triangular Pastures
- poj- 1948- Triangular Pastures-DP
- poj 1948 Triangular Pastures 二维01背包
- 携程第二场 Poj 1182 食物链(带权并查集) Poj 1948 Triangular Pastures Poj(dp二维背包) 1740 A New Stone Game(博弈)