| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
多重背包,16MS过。以下是思想及代码!计算total value如果为奇数则不可分;
否则平分total value 记做V,转化为多重背包cost和weight相等都为i(1..6),数量为输入的数据记为n[i];背包的容量为V。然后利用多重背包的优化算法(转化为0,1和完全背包)计算是否能装满容量为V的背包。在这里装满的条件是在初始化的时候对f(记录最优值的数组)有f[0]=0,其他都等于一个大的负数。最后如果F[v]=V则可以分解。以下是代码:
#include <iostream>
using namespace std;
const int MAX=120000;
const int len=7;
int f[MAX];
int n[len];
int V;
const int init=-9999;
int max(int a,int b)
{
return a>b?a:b;
}
void zeroOnePack(int cw)
{
for(int v=V;v>=cw;v--)
f[v]=max(f[v],f[v-cw]+cw);
}
void completePack(int cw)
{
for(int v=cw;v<=V;v++)
f[v]=max(f[v],f[v-cw]+cw);
}
void multiplePack(int cw,int amount)
{
if(cw*amount>V)
{
completePack(cw);
return;
}
int k=1;
while(k<amount)
{
zeroOnePack(k*cw);
amount=amount-k;
k=k*2;
}
zeroOnePack(amount*cw);
}
int main()
{
int count=0;
while(1)
{
count++;
int i;
int bin=0;
int sum=0;
for(i=1;i<len;i++)
{cin>>n[i]; bin|=n[i];sum+=i*n[i];}
if(bin==0) break;
if(sum%2!=0)
cout<<"Collection #"<<count<<":\n"<<"Can't be divided."<<endl<<endl;
else
{
sum/=2;
V=sum;
f[0]=0;
for(i=1;i<=V;i++)
f[i]=init;//f的初始化要考虑是否装满背包
for(i=1;i<len;i++)
multiplePack(i,n[i]);
if(f[V]!=V)
cout<<"Collection #"<<count<<":\n"<<"Can't be divided."<<endl<<endl;
else
cout<<"Collection #"<<count<<":\n"<<"Can be divided."<<endl<<endl;
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator