多重背包板子求助
  • 板块学术版
  • 楼主___A__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/28 19:13
  • 上次更新2023/10/28 19:24:24
查看原帖
多重背包板子求助
275860
___A__楼主2023/10/28 19:13

P1537 弹珠

#include<bits/stdc++.h>
using namespace std;
const int N=__lg(int(2e4))*2e4;
int a[N],cas;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	while(1){
		int sum=0,n=0;
		for(int i=1,x;i<=6;i++){
			cin>>x,sum+=x*i;//有x件价格为i的
			int bit=1;
			while(bit<=x){
				a[++n]=bit*i,x-=bit,bit*=2;
			}
			if(x>0){
				a[++n]=x*i;
			}
		}
		if(!sum){
			return 0;
		}
		printf("Collection #%d:\n",++cas);
		if(sum%2){
			cout<<"Can't be divided.\n\n";
			continue;
		}
		int dp[N]={};
		dp[0]=1;
		for(int i=1;i<=n;i++){
			for(int j=sum/2;j>=a[i];j--){
				dp[j]|=dp[j-a[i]];
			}
		}
		if(dp[sum/2]){
			cout<<"Can be divided.\n\n";
		}
		else{
			cout<<"Can't be divided.\n\n";
		}
	}
}
2023/10/28 19:13
加载中...