• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
FightingForWorldFinal
博客园    首页    新随笔    联系   管理    订阅  订阅

HDU1059 DP模板

#include<stdio.h>
int dp[120005];
int V,v;
void bag01(int c,int w)//01背包
{
 for(v=V; v>=c; v--)
  if(dp[v]<dp[v-c]+w)
   dp[v]=dp[v-c]+w;
}
void bagall(int c,int w)//完全背包
{
 for(v=c; v<=V; v++)
  if(dp[v]<dp[v-c]+w)
   dp[v]=dp[v-c]+w;
}
void mutibag(int c,int w,int p)//多重背包
{
 if(c*p>=V)
  bagall(c,w);
 else
 {
  int k=1;
  while(k<p)
  {
   bag01(c*k,w*k);
   p=p-k;
   k=k+k;
  }
  bag01(c*p,w*p);
 }
}
int main()
{
 int n[8];
 int i,sum,p=0;
 while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]),n[1]+n[2]+n[3]+n[4]+n[5]+n[6])
 {
  sum=n[1]+n[2]*2+n[3]*3+n[4]*4+n[5]*5+n[6]*6;  //sum为奇数个,那么肯定不能平分
  if(sum%2)
  {
   printf("Collection #%d:\nCan't be divided.\n\n",++p);
   continue;
  }
  V=sum/2;
  for(i=0; i<=V; i++)
   dp[i]=0;
  for(i=1; i<=6; i++)
   mutibag(i,i,n[i]);
  if(dp[V]==V)
   printf("Collection #%d:\nCan be divided.\n\n",++p);
  else
   printf("Collection #%d:\nCan't be divided.\n\n",++p);
 }
 return 0;
}

posted @ 2013-07-17 21:50  Sky-J  阅读(256)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3