bitset优化:过了!!!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 120005; //最大价值和
bitset <N> dp;
//如果价值有一个价值x,那么x这个位置就为1。
int a[10] ;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int Case = 0;
while(1) {
Case++;
int sum = 0;
for(int i = 1; i <= 6; i++) cin >> a[i], sum += i * a[i] ;
if(sum == 0) break ;
cout << "Collection #" << Case << ":" << '\n';
if(sum & 1) {
cout << "Can't be divided." << '\n' << '\n';
continue ;
}
dp.reset() ;
dp.set(0) ; //将 dp 的第 0 位(也就是和值为 0 的情况)设置为 1。
int ok = 0;
for(int i = 1; i <= 6; i++) {
for(int j = 1; j <= a[i]; j++) {
dp |= (dp << i); //转化成位数,价值为i相当于位数左移i位上为1;
if(dp[sum / 2]) ok = 1;
}
}
if(ok) cout << "Can be divided." << '\n';
else cout << "Can't be divided." <<'\n';
cout << '\n';
}
return 0;
}
朴素做法,看成01背包。。。tle一个测试点
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 120005; //最大价值和
int dp[N];
int a[10] ;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int Case = 0;
while(1) {
Case++;
int sum = 0;
for(int i = 1; i <= 6; i++) cin >> a[i], sum += i * a[i] ;
if(sum == 0) break ;
cout << "Collection #" << Case << ":" << '\n';
if(sum & 1) {
cout << "Can't be divided." << '\n' << '\n';
continue ;
}
dp[0]=1;
int ok = 0;
for(int i = 1; i <= 6; i++) {
for(int j = 0; j <= a[i]; j++) {
for(int k=sum;k>=j*i;k--)
{
dp[k]|=dp[k-j*i];
if(dp[sum/2]) ok=1;
}
}
}
if(ok) cout << "Can be divided." << '\n';
else cout << "Can't be divided." <<'\n';
cout << '\n';
}
return 0;
}