poj 1948 Triangular Pastures(二维0/1背包)
来源:互联网 发布:淘宝托管哪家好 编辑:程序博客网 时间:2024/06/03 04:41
点击打开链接poj 1948
思路: 二维0/1背包
分析:
1 题目要求从n个木棒里面选出m个组成一个三角形,使得三角形的面积最大
2 对于三角形来说知道了两条边和周长就可以求面积,按照0/1背包的思想dp[i][j][k]表示前i个木棒能否组成第一条边为长度j,第二条长度为k。如果dp[j-v[i]][k] 或dp[j][k-v[i]] 为true则dp[j][k]就为true
3 我们求出了所有可能的组合之和,就去枚举所有的边长的情况,然后求最大的面积
代码:
#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N = 45;const int MAXN = 2010;int n , sum , v[N];bool dp[MAXN][MAXN];int solve(){ memset(dp , false , sizeof(dp)); dp[0][0] = 1; for(int i = 1 ; i <= n ; i++){ for(int j = sum/2 ; j >= 0 ; j--){ // 最大的边长为周长的一半 for(int k = j ; k >= 0 ; k--){// 两条边存在大小的关系,所以直接让k <= j 即可 if(j >= v[i] && dp[j-v[i]][k]) dp[j][k] = true; if(k >= v[i] && dp[j][k-v[i]]) dp[j][k] = true; } } } int ans; ans = -1; for(int j = 1 ; j <= sum/2 ; j++){ for(int k = 1 ; k <= j ; k++){// 由于上面是j >= k,这里k枚举到j int t = sum-j-k; if(dp[j][k] && t > 0 && j+k > t && j+t > k && t+k > j){ // 注意由于求最大的面积,这边求p注意,求tmp的时候才转化为int double p=(t+j+k)/2.0; int tmp=(int)(sqrt(p*(p-t)*(p-j)*(p-k))*100); ans = max(ans , tmp); } } } return ans;}int main(){ while(scanf("%d" , &n) != EOF){ sum = 0; for(int i = 1 ; i <= n ; i++){ scanf("%d" , &v[i]); sum += v[i]; } printf("%d\n" , solve()); } return 0;}
- poj 1948 Triangular Pastures(二维0/1背包)
- POJ 1948 Triangular Pastures 二维 0-1背包
- 0-1背包-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 (dp 二维01背包)
- POJ 1948 (Triangular Pastures)二维背包 DP/DFS
- poj 1948 Triangular Pastures (二维背包dp)
- 【POJ 1948】Triangular Pastures(dp—二维01背包)
- poj 1948 Triangular Pastures 01背包
- POJ 1948 TRIANGULAR PASTURES(背包问题)
- POJ 1948 Triangular Pastures(01背包)
- poj 1948 Triangular Pastures
- poj 1948 Triangular Pastures
- POJ 1948 Triangular Pastures
- What's new in windows server 2012 networking (Part 4)
- 虚拟机网络连接方式
- NTDLL
- [cygwin]mintty窗口中输出的中文是乱码
- Linux C 多线程编程 互斥锁与条件变量
- poj 1948 Triangular Pastures(二维0/1背包)
- Ubuntu 12.04安装中文输入法(ibus)
- 笔记
- GDB调试命令
- hibernate in 查询
- 解决ScrollView滑动过程中ScrollTo()方法不起作用的问题
- 8086逻辑移位指令SHL和SHR
- c++学习之通用句柄的使用
- java.net.SocketTimeoutException: Connection timed out