首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hdu 1117 Big Event in HDU(多重双肩包)

2012-10-05 
hdu 1117 Big Event in HDU(多重背包)这题目和完全背包问题很类。基本的方程只需将完全背包问题的方程略微

hdu 1117 Big Event in HDU(多重背包)

这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

 

Sample Output

20 1040 40

这是多重背包,背包的上线时total/2;

代码:

#include<iostream>using namespace std;int dp[250025];int v[100],num[100];int max( int a,int b ) {     return a > b ? a : b; } int main(){    int i,j,n,sum,cnt,k;    while(scanf("%d",&n),n>0)    {      cnt=0;      for(i=0;i<n;i++){ scanf("%d%d",&v[i],&num[i]);cnt+=v[i]*num[i];}      memset(dp,0,sizeof(dp));      sum=cnt/2;      for(i=0;i<n;i++)        for(j=0;j<num[i];j++)           for(k=sum;k>=v[i];k-=v[i])                              dp[k]=max(dp[k],dp[k-v[i]]+v[i]);      if(cnt-dp[sum]>dp[sum])       printf("%d %d\n",cnt-dp[sum],dp[sum]);       else printf("%d %d\n",dp[sum],cnt-dp[sum]);    }    return 0;}                   


热点排行