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

HDU 1171 Big Event in HDU (多重双肩包)

2013-09-06 
HDU1171Big Event in HDU(多重背包)Big Event in HDUTime Limit: 10000/5000 MS (Java/Others)Memory Limi

HDU 1171 Big Event in HDU (多重背包)

Big Event in HDU

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19108    Accepted Submission(s): 6707


Problem DescriptionInputOutputSample InputSample Outputimport java.io.*;import java.util.*;public class Main {int n;int dp[]=new int[100000];int sum,vsum;public static void main(String[] args) {new Main().work();}void work(){Scanner sc=new Scanner(new BufferedInputStream(System.in));while(sc.hasNext()){n=sc.nextInt();if(n<0) break;Node node[]=new Node[n];Arrays.fill(dp, 0);vsum=sum=0;for(int i=0;i<n;i++){int v=sc.nextInt();int m=sc.nextInt();sum+=v*m;node[i]=new Node(v,m);}vsum=sum>>1;// 设备要尽量评分,所以要除以2:注:右一位代表除以2for(int i=0;i<n;i++){multiplyPack(node[i].v,node[i].v,node[i].m);}System.out.println((sum-dp[vsum])+" "+dp[vsum]);}}void multiplyPack(int cost,int weight,int amount){if(cost*amount>=vsum){//如果价值大于总共价值的一半,假设设备是无限的,按照完全背包来处理completePack(cost,weight);}else{//如果小于总共价值的一半,即按照01背包来处理int k=1;while(k<amount){zeroOnePack(k*cost,k*weight);amount-=k;k<<=1;//左一位代表乘以2}zeroOnePack(amount*cost,amount*weight);}}//01背包void zeroOnePack(int cost,int weight){for(int i=vsum;i>=cost;i--){dp[i]=Math.max(dp[i],dp[i-cost]+weight);}}//完全背包void completePack(int cost,int weight){for(int i=cost;i<=vsum;i++){dp[i]=Math.max(dp[i],dp[i-cost]+weight);}}class Node{int v;int m;Node(int v,int m){this.v=v;this.m=m;}}}

热点排行