有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。
其中大理石的总数不超过20000。
输入格式
输入包含多组数据!
每组数据占一行,包含6个整数,表示a[1]~a[6]。
当输入为0 0 0 0 0 0时表示输入结束,且该行无需考虑。
输出格式
每组数据输出一个结果,每个结果占一行。
如果可以实现则输出“Can”,否则输出“Can’t”
输入样例:
4 7 4 5 9 1
9 8 1 7 2 4
6 6 8 5 9 2
1 6 6 1 0 7
5 9 3 8 8 4
0 0 0 0 0 0
输出样例:
Can't
Can
Can't
Can't
Can
方法一:二进制优化 dp
T...
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int n=6, m=120005;
int k=1, w[n+1], f[m];
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
while (true) {
ll x,s=0;
for (int i=1; i<=n; i++) {
cin>>x, s+=i*x;
for (int j=1; j<=x; j<<=1) w[k++]=i*j, x-=j;
if (x) w[k++]=i*x;
}
if (s==0) break;
if (s&1) cout << "Can't\n";
else {
f[0]=1;
for (int i=1; i<=k; i++)
for (int j=m; j>=w[i]; j--) {
f[j]|=f[j-w[i]];
}
cout << (f[s/2] ? "Can\n" : "Can't\n");
}
}
return 0;
}
复杂度分析
- Time:\(O(nlog_2x)\),
- Space:\(O(...)\),
方法二:贪心+dp
复杂度分析
- Time:\(O()\),
- Space:\(O()\),