1. 程式人生 > >hdu 1059

hdu 1059

col break += bsp lag memset vid cst hdu 1059

題目大意:就是有價值1、2、3、4、5、6的硬幣各多少個,然後讓你判斷能否把他們分成價值相等的兩部分。

題目思路:目測dp,一看果然dp,完全背包,需要剪枝,硬幣個數為容量,下標為value,用一個bool數組就可以標記是否有方案能構成當前下標的money。最後判斷數組中下標為sum/2的值是否為為true即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool flag[120005];
int main()
{
    int a[7
]; int i,j,k,cnt = 0; while(scanf("%d%d%d%d%d%d",a+1,a+2,a+3,a+4,a+5,a+6)) { if(a[1]==0 && a[1]==a[2] && a[2]==a[3] && a[3]==a[4] && a[4]==a[5] && a[5]==a[6]) break; cnt++; memset(flag, 0, sizeof(flag)); int
sum = a[1]+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6; if(sum%2 == 1) { printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); continue; } flag[0]=true; int maxn = 0; for(i=1;i<=6;++i) { for(j=maxn; j>=0; --j) {
if(flag[j]) { for(k=1; k<=a[i] && j+k*i <= sum/2; ++k) { if(flag[j+k*i]) break; flag[j+k*i] = true; } } } maxn += a[i]*i; } if(flag[sum/2]) printf("Collection #%d:\nCan be divided.\n\n",cnt); else printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); } }

hdu 1059