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