pasture三角形牧场 动态规划

题目:

【培训习题.动态规划】8.7pasture三角形牧场

Time Limit:1000MS  Memory Limit:65536K
Total Submit:32 Accepted:6

Description

和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。 

请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。 

Input

第1行:一个整数N 

第2..N+1行:每行包含一个整数,即是木板长度。 

Output

仅一个整数:最大牧场面积乘以100然后舍尾的结果。 

如果无法构建,输出-1。

Sample Input

pasture.in
5
1
1
3
3
4

Sample Output

pasture.out
692

Hint

【样例解释】 

692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。 

Source

【培训习题.动态规划】8.7pasture三角形牧场


代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
bool f[41][1601][1601]={false};

int 
pd(int a,int b,int c)
{
	if(a+b>c&&a+c>b&&b+c>a)return 1;
	return 0;
}

double 
s(int a,int b,int c)
{
	double p=(double)(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c))*100;
}
int main()
{
    //freopen("data11.in","r",stdin);
    //freopen("data.txt","w",stdout);
	int n,sum=0,j,k,i;
	double max=0.0,a1,a2;
	int a[50]={0};
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	f[0][0][0]=true;
	for(i=1;i<=n;i++){
		for(j=0;j<=sum/2+1;j++){
			for(k=0;k<=sum/2+1;k++){
				if(f[i-1][j][k]){
					f[i][j+a[i]][k]=true;
					f[i][j][k+a[i]]=true;
					f[i][j][k]=true;
					if(pd(j+a[i],k,sum-j-a[i]-k)){
						a1=s(j+a[i],k,sum-j-a[i]-k);
						if(a1>max)max=a1;
					}
					if(pd(j,k+a[i],sum-j-k-a[i])){
                        
					    a2=s(j,k+a[i],sum-j-k-a[i]);
						if(a2>max)max=a2;
					}
				}
			}
		}
	}
	if((int)max<=0.0){
		printf("-1\n");
		return 0;
	}
	printf("%d\n",(int) max);
	//system("pause");
	return 0;
}

思路:
i为前几块,j一边,k二边。

然后dp就是递推。

优化:
1.可能有i推i-1会比较好
2.循环sum/2+1;
3.可以滚动数组。把i去掉的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值