#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int dp[109][2009];
int a[109];
int main()
{
int i,j,t,n,add=0,s,z=0;
scanf("%d",&t);
while(t--)
{
z=0;
s=0;
add++;
printf("Case %d: ",add);
scanf("%d",&n);
memset(dp,-1,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s+=a[i];
if(a[i]==0)z++;
}
dp[1][0]=0;
dp[1][a[1]]=0;
for(i=2;i<=n;i++)
{
for(j=0;j<=s;j++)
{
dp[i][j]=dp[i-1][j];
if(j>=a[i]&&dp[i-1][j-a[i]]!=-1)//放到重的一边
dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]);
if(j<a[i]&&dp[i-1][a[i]-j]!=-1)//放到轻的一边
dp[i][j]=max(dp[i][j],dp[i-1][a[i]-j]+a[i]-j);
if(j+a[i]<=s&&dp[i-1][j+a[i]]!=-1)//放到轻的一边
dp[i][j]=max(dp[i][j],dp[i-1][j+a[i]]+a[i]);
}
}
if(dp[n][0]||(dp[n][0]==0&&z>0))
printf("%d\n",dp[n][0]);
else
printf("-1\n");
}
return 0;
}
双塔DP——hdu3578
转载读题发现 每个物品有三种执行方式:
1。放到轻的那边
2。放到重的那边
3。不放
dp[i][j]表示到第n个物品时,重量差为j时的重量小的一端的重量,不存在则为-1。
View Code
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:排列组合——hdu 4151
下一篇:DFS——hdu4068
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【VIJOS - P1037】搭建双塔(dp)
题干:描述2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了
#include #define i++ -
hdu 6170 - dp
题目链接:点击打开链接题解思路:因为数据就2500我们很容易想到dp,要
c++ i++ #include -
hdu 5001(dp)
题意:有n个城市,m条边,一个人挑选一个城市为起点(概率相等),然后走d步,每走一de #includ
hdu i++ #include 概率dp -
hdu 2577(DP)
How to TypeTime Limit: 2000/1000 Msoftware. He called Cathy to test
dp #include Java i++