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 |
背包九讲二进制思想优化(代码还算干净)#include <cstdio> #include <cstring> #define Max(a,b) (a)>(b)?(a):(b) int dp[100001],Cost[11],Count[11],cash; void ZeroOnePack(int cost){ int i; for(i=cash;i>=cost;i--) dp[i]=Max(dp[i],dp[i-cost]+cost); } void CompletePack(int cost){ int i; for(i=cost;i<=cash;i++) dp[i]=Max(dp[i],dp[i-cost]+cost); } void MultiplePack(int cost,int count){ if(cost*count > cash) CompletePack(cost); else{ int k=1; while(k < count){ ZeroOnePack(k*cost); count -= k; k *= 2; } ZeroOnePack(count*cost); } } int main(){ int n,i,j,k; while(~scanf("%d%d",&cash,&n)){ for(i=1;i<=n;i++) scanf("%d%d",&Count[i],&Cost[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) MultiplePack(Cost[i],Count[i]); printf("%d\n",dp[cash]); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator