-
B - 多重背包
- POJ - 1276
- 钱数即为价值也为权重.
-
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; #define maxn 100015 int dp[maxn]; int n,sum; struct node { int s,p; } a[15]; void zorepack(int cost,int w) { for(int i=sum; i>=cost; i--) dp[i]=max(dp[i],dp[i-cost]+w); } void completepack(int cost,int w) { for(int i=cost; i<=sum; i++) dp[i]=max(dp[i],dp[i-cost]+w); } void multpack(int cost,int w,int amout) { if(cost*amout>sum)completepack(cost,w); else { int k=1; while(k<amout) { zorepack(k*cost,k*w); amout-=k; k<<=1; } zorepack(amout*cost,amout*w); } } int main() { while(~scanf("%d%d",&sum,&n)) { memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) scanf("%d%d",&a[i].s,&a[i].p); for(int i=0; i<n; i++) multpack(a[i].p,a[i].p,a[i].s); printf("%d\n",dp[sum]); } return 0; }
Cash Machine POJ - 1276 -多重背包-裸
最新推荐文章于 2021-11-11 13:45:35 发布