题解:P10961 划分大理石
题意
有
思路
设总大小为 Can't 了。
对于
代码
#include<bits/stdc++.h>
using namespace std;
int a[7];
int w[20001];
bool dp[210001];
int main(){
int tot;
while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])){
if((a[1]+a[3]+a[5])%2!=0){//不是偶数就直接输出Can't
printf("Can't\n");
continue;
}
memset(dp,0,sizeof(dp));//多测清空
tot=0;
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0){
return 0;
}
int js=(a[1]+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6)/2;//计算sum/2
for(int i=1;i<=6;i++){
int base=1;
while(base<=a[i]){//二进制拆分
a[i]-=base;
w[++tot]=base*i;//体积和价值也等比例放大
base*=2;
}
if(a[i]!=0){//这里别忘记把多余的加进去
w[++tot]=a[i]*i;
}
}
dp[0]=1;
for(int i=1;i<=tot;i++){//完全背包
for(int j=js;j>=w[i];j--){//遍历顺序别反了
if(dp[j-w[i]]){
dp[j]=1;
}
}
}
if(dp[js]){//假如sum/2可以
printf("Can\n");
}
else{
printf("Can't\n");
}
}
return 0;
}
AC 记录。