#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 - 4826(dp)
度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左
#include 数据 i++ -
hdu 5185(dp)
Equationtion like thi
dp #include Java i++ -
hdu 2084(dp)
题目:在讲述DP算法的时候,一个经
dp ci 结点 #include