Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

多重背包二进制缩时AC

Posted by majuncheng at 2009-09-02 12:46:58 on Problem 1276
/*多重背包问题,本题如不使用二进制分物品可能会超时,
毕竟数目不小。另一个要注意的点是不用考虑找的最少钱数,
只要能找出钱就行了,因此用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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator