| ||||||||||
| 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 | |||||||||
多重背包二进制缩时AC
/*多重背包问题,本题如不使用二进制分物品可能会超时,
毕竟数目不小。另一个要注意的点是不用考虑找的最少钱数,
只要能找出钱就行了,因此用0和1(dp[0]=1)赋值就行了,如
果能找到钱就赋非0值,结果输出dp值为非0的最大数就行了。*/
#include <cstdio>
int value[100];
int dp[100010];
int main()
{
int cash,n,count,num,val;
while(scanf("%d",&cash)!=EOF)
{
count=0;
scanf("%d",&n);
for ( int i=0;i<n;i++)
{
scanf("%d%d",&num,&val);
int k=1;
while (num-k>=0)
{
num-=k;
value[count++]=k*val;
k*=2;
}
if (num) value[count++]=num*val;
}
for (int i=1;i<=cash;i++)
dp[i]=0;
dp[0]=1;
for (int i=0;i<count;i++)
for (int v=cash;v>=value[i];v--)
if (!dp[v])
dp[v]=dp[v-value[i]];
for (int i=cash;i>=0;i--)
if (dp[i])
{ printf("%d\n",i); break;}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator