acm-求大神看看这两个代码差别在哪里,运行结果不同啊 poj1014

问题描述

求大神看看这两个代码差别在哪里,运行结果不同啊 poj1014

错误代码及运行结果

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t=0,i,v;
int n[7];
int dp[60001];

bool flag =false;
int imax(int a,int b)
{
    return (a>b?a:b);
}

void comepletepack(int cost,int weight)
{
    for(i=cost;i<=v;++i)
    {
        dp[i]=imax(dp[i],dp[i-cost]+weight);
        if(dp[i]==v)
        {
            flag =true;
            return;
        }
    }
}
void onezeropack(int cost,int weight)
{
    for(i=v;i>=cost;--i)
    {
        dp[i]=imax(dp[i],dp[i-cost]+weight);
        if(dp[i]==v)
        {
            flag =true;
            return;
        }
    }
    return;
}
void mutipack(int cost,int weight,int amount)
{
    if(cost*amount>=v)
    {
        comepletepack(cost,weight);
        return;
    }
    if(flag)
        return;
    int k=1;
    while(k<amount)
    {
        onezeropack(k*cost,k*weight);
        if(flag)
        return;
        amount-=k;
        k*=2;
    }
    onezeropack(amount*cost,amount*weight);

}

int main()
{
    int sum;
    while(scanf("%d %d %d %d %d %d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]))
    {
        ++t;
        sum =n[1]+2*n[2]+3*n[3]+4*n[4]+5*n[5]+6*n[6];
        if(sum==0)
        break;
        if(sum%2!=0)
        {
            cout<<"Collection #"<<t<<':'<<endl;
            cout<<"Can't be divided."<<endl;
            cout<<endl;
            continue;
        }
            v=sum/2;
            memset(dp,-1,sizeof(dp));
            dp[0]=0;
            flag =false;
            for(i=1;i<=6;++i)
            {
                mutipack(i,i,n[i]);
                if(flag)
                break;
            }

        if(!flag)
        {
            cout<<"Collection #"<<t<<':'<<endl;
            cout<<"Can't be divided."<<endl;
            cout<<endl;
        }
        else
        {
            cout<<"Collection #"<<t<<':'<<endl;
            cout<<"Can be divided."<<endl;
            cout<<endl;
        }
    }
    return 0;
}

正确代码及其运行结果

 #include<iostream>
#include <cstring>
   using namespace std;

   int n[7];  //价值为i的物品的个数
  int v;  //背包容量
  int SumValue;  //物品总价值
  bool flag;    //标记是否能平分SumValue
  int dp[100000];  //状态数组

  int max(int a,int b)
  {
      return a>b?a:b;
  }

  /*完全背包*/
 void CompletePack(int cost,int weight)
  {
      for(int i=cost;i<=v;i++)
      {
          dp[i]=max(dp[i],dp[i-cost]+weight);
          if(dp[i]==v)    //剪枝,当能够平分SumValue时退出
          {
              flag=true;
              return;
          }
      }

      return;
  }

  /*01背包*/
  void ZeroOnePack(int cost,int weight)
  {
      for(int i=v;i>=cost;i--)
     {
          dp[i]=max(dp[i],dp[i-cost]+weight);
          if(dp[i]==v)    //剪枝
          {
              flag=true;
              return;
          }
      }
      return;
  }

 /*多重背包*/
  void MultiplePack(int cost,int weight,int amount)
  {
      if(cost*amount>=v)
      {
          CompletePack(cost,weight);
          return;
      }

      if(flag)    //剪枝
          return;

      /*二进制优化*/
      int k=1;
      while(k<amount)
      {
          ZeroOnePack(k*cost,k*weight);

          if(flag)    //剪枝
              return;

          amount-=k;
          k*=2;
      }
      ZeroOnePack(amount*cost,amount*weight);

     return;
  }

  int main(int i)
  {
      int test=1;
      while(cin>>n[1]>>n[2]>>n[3]>>n[4]>>n[5]>>n[6])
      {
          SumValue=0;  //物品总价值

          for(i=1;i<=6;i++)
              SumValue+=i*n[i];

          if(SumValue==0)
              break;

          if(SumValue%2)    //sum为奇数,无法平分
          {
              cout<<"Collection #"<<test++<<':'<<endl;
              cout<<"Can't be divided."<<endl<<endl;    //注意有空行
              continue;
          }

         v=SumValue/2;
         memset(dp,-1,sizeof(dp));
        dp[0]=0;
         flag=false;

         for(i=1;i<=6;i++)
         {
             MultiplePack(i,i,n[i]);

            if(flag)    //剪枝
                 break;
         }

        if(flag)
         {
             cout<<"Collection #"<<test++<<':'<<endl;
            cout<<"Can be divided."<<endl<<endl;
             continue;
         }
        else
         {
             cout<<"Collection #"<<test++<<':'<<endl;
            cout<<"Can't be divided."<<endl<<endl;
             continue;
       }
     }
     return 0;
 }

求大神看看错的错在哪里了

解决方案

http://www.cnblogs.com/lyy289065406/archive/2011/08/04/2128033.html

时间: 2024-09-28 09:46:33

acm-求大神看看这两个代码差别在哪里,运行结果不同啊 poj1014的相关文章

数据结构 递归与栈-求大神指导调用递归函数中的栈是怎么运行的

问题描述 求大神指导调用递归函数中的栈是怎么运行的 回溯法与树的遍历 回溯法:其求解过程实质是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的,而 是隐含在遍历过程中. 题目描述:求含n个元素的集合的幂集. 例:A={1,2,3},则A的幂集为{{1,2,3},{1,2},{1, 3},{2,3},{1},{2},{3},{}} 解题思路:求幂集的过程可看成是依次对集合A中的元素进行取或舍的过程. 选择合适的数据结构--假设以线性表表示集合. 树根结点表示幂集元素的初始

求大神帮忙看看这段代码的问题在哪,求修改一下

问题描述 求大神帮忙看看这段代码的问题在哪,求修改一下 10C 这是题目,代码如下: #include#includeusing namespace std; class People{public: People(const string&NOconst string&nameconst string&sexconst string&IDNOconst string&Birthday); virtual void show()=0;protected: strin

碎片化-求大神解决,android碎片,在手机模拟器可以运行,在平板报错了

问题描述 求大神解决,android碎片,在手机模拟器可以运行,在平板报错了 说是null指针,我都定义layout-large的xml,不是很懂,怎样查找求大神... 解决方案 http://blog.sina.com.cn/s/blog_6400e5c50101l9xc.html 解决方案二: activity启动失败 在手机上能运行吗?

设计-求大神帮我看一下代码哪里有问题,这是用verilog写的sdram的数据模块

问题描述 求大神帮我看一下代码哪里有问题,这是用verilog写的sdram的数据模块 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 12:07:50 04/20/2016 // Design Name: // Module Name: datage

软件开发-求大神帮我看看C++代码

问题描述 求大神帮我看看C++代码 以下是我的.h头文件: #include <vector> #include<iostream> #include <iomanip> #include <math.h> #define M_PI 3.14159265359 ////////**************定义目标状态***************//////// typedef struct strTargetState//笛卡尔坐标系位置 { double

c++基础c++-求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导

问题描述 求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导 年龄 Age姓名 char name公有成员函数: 构造函数 带参数的构造函数Student(int mchar); 不带参数的构造函数 Student() 析构函数 -Student() 改变数据成员值函数 void SetMemer(int mchar *) 获取数据成员函数 int GetAge() char * GetName()要求:在main()中定义一个有3个元素的对象数组并分别初始化,然后输出对象数

为什么需要标示符,求大神。在第三行代码,编译时出错。

问题描述 为什么需要标示符,求大神.在第三行代码,编译时出错. class Point{ double x,y,z; Point(double_x,double_y,double_z ) { x=_x; y=_y; z=_z; } void setX(double _x){ x=_x; } void setY(double _y){ y=_y; } void setZ(double_z){ z=_z; } double getDistance(Point P){ return(x-p.x)*(x

jsp-JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码

问题描述 JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码 JSP传给action的是字符串类型,怎么转换数据类型,然后让getlist()接收,求各位大神帮帮忙写下代码~ 如果能够给解释一下,那就千恩万谢啦 解决方案 可以通过强制转换在前面加上int 解决方案二: gongWenLeiBieList = dao.getList(Integer.parseInt(mingCheng));

求大神将下面这个c代码改成c#的。。。跪谢

问题描述 求大神将下面这个c代码改成c#的...跪谢 const WORD wCRCTalbeAbs[] = {0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400, }; WORD CRC16_2(BYTE* pchMsg, WORD wDataLen) { WORD wCRC = 0xFFFF;