HDU 1059 Dividing (多重背包问题)
来源:互联网 发布:mac化妆品 编辑:程序博客网 时间:2024/06/05 10:22
思路:
转换为多重背包问题,将总价值求出,然后分两半,对于一个人当总花费为总价值的一半时,看得到的价值是否等于总花费;
AC代码:
#include<stdio.h>int a[7];int dp[120000];int V;void CompletePack(int c,int w){ int v;for(v=c;v<=V;v++)if(dp[v]<dp[v-c]+w)dp[v]=dp[v-c]+w;}void ZeroOnePack(int c,int w){ int v; for(v=V;v>=c;v--) if(dp[v]<dp[v-c]+w) dp[v]=dp[v-c]+w;}void MultiplePack(int c,int w,int amount){ int k;if(c*amount>V){ CompletePack(c,w);return;}k=1;while(k<amount){ ZeroOnePack(k*c,k*w); amount-=k;k*=2;}ZeroOnePack(amount*c,amount*w);}int main(){int i;int sum;int count=1;while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=-1&&(a[1]+a[2]+a[3]+a[4]+a[5]+a[6])!=0){ sum=0; for(i=1;i<=6;i++) { sum+=i*a[i]; } if(sum%2) { printf("Collection #%d:\nCan't be divided.\n\n",count++); continue; } V=sum/2; for(i=0;i<=V;i++)dp[i]=0; for(i=1;i<=6;i++) MultiplePack(i,i,a[i]); if(dp[V]==V) printf("Collection #%d:\nCan be divided.\n\n",count++); else printf("Collection #%d:\nCan't be divided.\n\n",count++);}return 0;}
- hdu 1059 Dividing--DP-多重背包问题
- HDU 1059 Dividing (多重背包问题)
- hdu 1059 多重背包问题 Dividing
- HDU 1059 Dividing 多重背包问题
- hdu 1059 Dividing 多重背包
- hdu 1059 Dividing(多重背包)
- hdu 1059 Dividing(多重背包)
- HDU 1059 Dividing(多重背包)
- hdu 1059 Dividing 多重背包
- Hdu 1059 Dividing -- 多重背包
- hdu 1059 Dividing 多重背包
- HDU-1059-Dividing-多重背包
- HDU-1059 Dividing 多重背包
- hdu 1059 Dividing (多重背包)
- HDU 1059 Dividing 多重背包
- Hdu 1059 Dividing (多重背包)
- HDU 1059 Dividing 多重背包
- hdu-1059-多重背包-Dividing
- MySQL中的字符串函数
- SDVO-DVI-I2C-register
- PB中查找到被修改过的数据窗口行
- 修改编译spawn-fcgi
- win8 在命令行下打开IE浏览器
- HDU 1059 Dividing (多重背包问题)
- wdlinux 增加php的sockets模块
- SSH私钥管理ssh-agent的使用
- iptables允许某个ip访问
- java向IOS设备推送消息
- PostMessage和SendMessage 区别(很容易忽略)
- 《时代周刊》封面文章:那些泄密的技术宅
- linux命令(14):head 命令
- 索引的查询路径1