poj1948 二维01背包
2018-02-07 16:35
441 查看
题目给一些木棒,要求全部用上形成三条边,问能形成的三角形最大面积是多少?
一般的做法是只管一个,这次我们是管两个。
dp[i][j],表示第一条边为i,第二条边为j的情况是否存在。不需要计算第三条边,因为第三条边就是sum-i-j。
对于当前的一根木棒,
我们按照正常的01背包做法
for(int i=0;i<n;i++)//每一个木棒
for(int j=sum/2;j>=0;j--) //第一个木棒。为什么是sum/2,因为三角形最长边不会大于sum/2的
for(int k=j;k>=0;k--) //第二个木棒
{
if(j>a[i]&&dp[j-a[i]][k]) //如果当前第一个木棒(背包)大于当前物体,也就是可以放进入,并且没放进之前的状态也存在
dp[j][k]=1;
if(k>a[i]&&dp[j][k-a[i]])
dp[j][k]=1;
}
之后for遍历所有的dp,求符合条件的三角形的面积即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include <fstream>
#include<vector>
#include<math.h>
using namespace std;
int dp[1000][1000];
int a[1100];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=0;j--)//第一根木棍
{
for(int k=j;k>=0;k--)//第二根木棍
{
if(j>=a[i]&&dp[j-a[i]][k]||k>=a[i]&&dp[j][k-a[i]])
{
dp[j][k]=1;
}
}
}
}
int ans=-1;
for(int i=sum/2;i>=1;i--)
{
for(int j=i;j>=1;j--)
{
if(dp[i][j])
{
int k=sum-i-j;
if(i+j>k&&i+k>j&&j+k>i)
{
double p = (i + j + k) * 1.0 / 2;
int temp = (int)(sqrt(p * (p - i) * (p - j) * (p - k)) * 100);
if (temp > ans)
ans = temp;
}
}
}
}
cout<<ans<<endl;
}
}
一般的做法是只管一个,这次我们是管两个。
dp[i][j],表示第一条边为i,第二条边为j的情况是否存在。不需要计算第三条边,因为第三条边就是sum-i-j。
对于当前的一根木棒,
我们按照正常的01背包做法
for(int i=0;i<n;i++)//每一个木棒
for(int j=sum/2;j>=0;j--) //第一个木棒。为什么是sum/2,因为三角形最长边不会大于sum/2的
for(int k=j;k>=0;k--) //第二个木棒
{
if(j>a[i]&&dp[j-a[i]][k]) //如果当前第一个木棒(背包)大于当前物体,也就是可以放进入,并且没放进之前的状态也存在
dp[j][k]=1;
if(k>a[i]&&dp[j][k-a[i]])
dp[j][k]=1;
}
之后for遍历所有的dp,求符合条件的三角形的面积即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include <fstream>
#include<vector>
#include<math.h>
using namespace std;
int dp[1000][1000];
int a[1100];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=0;j--)//第一根木棍
{
for(int k=j;k>=0;k--)//第二根木棍
{
if(j>=a[i]&&dp[j-a[i]][k]||k>=a[i]&&dp[j][k-a[i]])
{
dp[j][k]=1;
}
}
}
}
int ans=-1;
for(int i=sum/2;i>=1;i--)
{
for(int j=i;j>=1;j--)
{
if(dp[i][j])
{
int k=sum-i-j;
if(i+j>k&&i+k>j&&j+k>i)
{
double p = (i + j + k) * 1.0 / 2;
int temp = (int)(sqrt(p * (p - i) * (p - j) * (p - k)) * 100);
if (temp > ans)
ans = temp;
}
}
}
}
cout<<ans<<endl;
}
}
相关文章推荐
- 01背包问题整理(二维转一维数组)
- poj1948 二维背包
- poj 1948 二维01背包
- 二维费用背包--poj1948
- 01背包 完全背包 多重背包 二维费用背包
- poj1948(经典问题-二维背包 求面积最大三角形)
- hdu 3496 二维背包 01
- (博客搬迁)二维多重背包转化为01背包
- hdu 2126 Buy the souvenirs 二维01背包方案总数
- 知识点:01背包(多种姿势:二维实现+一维实现+滚动数组实现+背包装满+输出最优方案)
- 01背包问题的扩展——二维费用 LeetCode 474
- 二维背包——poj1948
- dp之01背包(从二维到一维)+完全背包
- DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
- poj 1948 二维01背包
- 简单的01背包 HDU - 2602 1864 二维、一维数组
- poj 1948二维01背包
- dd大牛背包九讲(01,完全,多重,混合,二维,分组等背包)(转载+补充)一万二千字!!!
- hdu 3496 二维费用的01背包
- hdu3496 二维01背包