HDU 1059 Dividing(多重背包)

来源:互联网 发布:python 定时执行函数 编辑:程序博客网 时间:2024/06/04 18:36

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059

题意:

输入6个数字,表示重量分别为1  2  3  4  5  6的大理石的数量

问能不能将这些大理石均分,不能把大理石弄破了

能的话就输出 Can be divided.

不能就输出Can't be divided.


解题思路:

边输入边求和

如果和为0,就break

如果和为奇数,就输出Can't be divided.

和为偶数,多重背包判断

将每一块大理石的重量的值当作花费的值,套一下模板就可以了

如果对多重背包不是特别理解的,推荐看一下入门题http://http://blog.csdn.net/yhyyxt/article/details/46968541


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>using namespace std;int p[10],ans;int dp[120005];void CompletePack(int cost,int weight){for(int i=cost;i<=ans;i++){dp[i] = max(dp[i],dp[i-cost]+weight);}}void ZeroOnePack(int cost,int weight){for(int i=ans;i>=cost;i--){dp[i] = max(dp[i],dp[i-cost]+weight);}}void multiplePack(int cost,int weight,int number){if(cost*number>=ans){CompletePack(cost,weight);return;}int k=1;while(k<number){ZeroOnePack(k*cost,k*weight);number-=k;k*=2;}ZeroOnePack(number*cost,number*weight);}int main(){int cas=0;while(1){ans=0;memset(dp,0,sizeof(dp));for(int i=1;i<=6;i++){scanf("%d",&p[i]);ans+=p[i]*i;}if(ans==0) break;printf("Collection #%d:\n",++cas);if(ans%2==1){printf("Can't be divided.\n\n");continue;}ans/=2;for(int i=1;i<=6;i++){multiplePack(i,i,p[i]);} if(dp[ans]==ans) {printf("Can be divided.\n\n");}else{printf("Can't be divided.\n\n");}}return 0;}




0 0
原创粉丝点击