HDOJ1171(多重背包)
#include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a>b)?a:b const int SIZE=100000+16; int nKind; //物品种类数目 int nLimit; //背包容量 int val[SIZE]; //每种背包的价值 int weight[SIZE]; //每种背包的重量 int bag[SIZE]; //每种背包的数目 int dp[SIZE]; //0-1背包, 代价为cost, 获得的价值为value void ZeroOnePack(int cost, int value) { for(int i=nLimit; i>=cost; i--) //逆序 { dp[i]=MAX(dp[i], dp[i-cost]+value); } } //完全背包, 代价为cost, 获得的价值为value void CompletePack(int cost, int value) { for(int i=cost; i<=nLimit; i++) //顺序 { dp[i]=MAX(dp[i],dp[i-cost]+value); } } //多重背包 代价为cost, 获得的价值为value, 该种背包的数目为amount void MultiplyPack(int cost, int value, int amount) { if(cost*amount>=nLimit) CompletePack(cost, value); else { int k=1; while(k<amount) { ZeroOnePack(k*cost, k*value); amount-=k; k<<=1; } ZeroOnePack(amount*cost, amount*value); } } int main() { while(scanf("%d",&nKind)!=EOF&&nKind>0) { int sum=0; for(int i=0;i<nKind;i++) { scanf("%d %d",&val[i],&bag[i]); weight[i]=val[i]; sum+=val[i]*bag[i]; } memset(dp,0,sizeof(dp)); nLimit=sum/2; for(int i=0;i<nKind;i++) { MultiplyPack(weight[i],val[i],bag[i]); } printf("%d %d\n",sum-dp[nLimit],dp[nLimit]); } return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步