首页 > 代码库 > hdu 1059 Dividing
hdu 1059 Dividing
题目:
链接:点击打开链接
题意:
判断是否能够平分弹珠。
算法:
多重背包。
思路:
模板。。。dp[i]中i表示花费。。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n[7]; int dp[120010]; int V; void bag_01(int c,int w)//01背包 { for(int i=V; i>=c; i--) dp[i] = max(dp[i],dp[i-c]+w); } void bag_all(int c,int w)//完全背包 { for(int i=c; i<=V; i++) dp[i] = max(dp[i],dp[i-c]+w); } void multibag(int c,int w,int p)//多重背包 { if(c*p >= V) bag_all(c,w); else { int k = 1; while(k<p) { bag_01(k*c,k*w); p -= k; k <<= 1; } bag_01(p*c,p*w); } } int main() { //freopen("input.txt","r",stdin); int kase = 0; while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]) && (n[1]+n[2]+n[3]+n[4]+n[5]+n[6])) { printf("Collection #%d:\n",++kase); int sum = (n[1]*1+n[2]*2+n[3]*3+n[4]*4+n[5]*5+n[6]*6); if(sum%2) { printf("Can‘t be divided.\n"); } else { V = sum/2; memset(dp,0,sizeof(dp)); for(int i=1; i<=6; i++) multibag(i,i,n[i]); if(dp[V] == V) printf("Can be divided.\n"); else printf("Can‘t be divided.\n"); } printf("\n"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。