hdu 2191 多重背包

来源:互联网 发布:android启动优化 编辑:程序博客网 时间:2024/04/29 21:34
#include<iostream>using namespace std;int N,V,dp[105];int max(int a,int b){return a > b ? a : b;}void ZeroOnePack(int weight,int value){for(int v = V;v >= weight;v--)dp[v] = max(dp[v],dp[v-weight]+value);}void CompletePack(int weight,int value){for(int v = weight;v <= V;v++)dp[v] = max(dp[v],dp[v-weight]+value);}void MultiplePack(int weight,int value,int count){if(weight*count >= V)  //如果次数和重量的积大于V,就类似于完全背包,因为完全背包可以取无数次,乘积必然大于V{CompletePack(weight,value);}else //否则的话二进制转换为01背包{int k = 1;while(k < count){ZeroOnePack(k*weight,k*value);count = count - k;k = k*2;}ZeroOnePack(count*weight,count*value);}}int main(){int t;scanf("%d",&t);while(t--){memset(dp,0,sizeof(dp));scanf("%d%d",&V,&N);int i,p,h,c;for(i = 1;i <= N;i++){scanf("%d %d %d",&p,&h,&c);MultiplePack(p,h,c);}printf("%d\n",dp[V]);}return 0;}

原创粉丝点击