二进制分组求调!
查看原帖
二进制分组求调!
804607
rainygame楼主2023/4/5 11:03
#include <bits/stdc++.h>
using namespace std;
#define MAXN 101
#define MAXM 40001

int n, t, sum, maxn, ind, ans = 0x3f3f3f3f;
int v[MAXN], c[MAXN];
int vt[MAXM], wt[MAXM];
int f1[MAXM], f2[MAXM];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> t;
	for (int i=1; i<=n; i++) cin >> v[i];
	
	for (int i=1; i<=n; i++){
		cin >> c[i];
		sum += v[i] * c[i];
		maxn = max(maxn, v[i] * v[i]);
		
		for (int j=1; j<=c[i]; j <<= 1){
			wt[++ind] = j * v[i];
			vt[ind] = j;
			c[i] -= j;
		}
		if (c[i]){
			wt[++ind] = c[i] * v[i];
			vt[ind] = c[i];
		}
	}
	
	if (sum < t){
		cout << -1;
		return 0;
	}
	
	memset(f1, 0x3f, sizeof(f1));
	memset(f2, 0x3f, sizeof(f2));
	f1[0] = f2[0] = 1;
	
	for (int i=1; i<=ind; i++){
		for (int j=t+maxn; j>=v[i]; j--) f1[j] = max(f1[j], f1[j-wt[i]]+vt[i]); 
	}
	
	for (int i=1; i<=ind; i++){
		for (int j=v[i]; j<=maxn; j++) f2[j] = max(f2[j], f2[j-v[i]]+1);
	}
	
	for (int i=t; i<=t+maxn; i++) ans = min(ans, f1[i]+f2[i-t]);
	
	if (ans == 0x3f3f3f3f) cout << -1;
	else cout << ans;
	
	return 0;
}

2023/4/5 11:03
加载中...