为啥用二进制优化错了呢?
查看原帖
为啥用二进制优化错了呢?
121813
老子是北瓜楼主2021/5/4 17:17

WA on #2

好像很多人都遇到了这个问题

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define N 5003
using namespace std;
int n,a[N],b[N],k,r[N],w[N],id[N];
int bucket[203];
int dp[20005],pre[20005],use[20005];
int main(){
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)
		scanf("%d",&a[i]);
	for(int i=1; i<=n; ++i)
		scanf("%d",&b[i]);
		
	int tot=0;	
	for(int i=1; i<=n; ++i)
	{
		int num=1;
		while(num<=b[i])
		{
			++tot;
			w[tot]=num;
			r[tot]=num*a[i];
			id[tot]=i;
			b[i]-=num;
			num*=2;
		}
		if(b[i]!=0){
			++tot;
			w[tot]=b[i];
			r[tot]=b[i]*a[i];
			id[tot]=i;
		}
	}
		
	scanf("%d",&k);
	for(int i=1; i<=k; ++i)
		dp[i]=99999999;
	for(int i=1; i<=tot; ++i)
		for(int j=k; j>=r[i]; --j){
			if(dp[j]>w[i]+dp[j-r[i]]){
				dp[j]=w[i]+dp[j-r[i]];
				pre[j]=j-r[i];
				use[j]=i;
				if(j==k){
					memset(bucket,0,sizeof(bucket));
					int t=k;
					while(t!=0){
						bucket[id[use[t]]]+=w[use[t]];
						t=pre[t];
					}
				}
			}
		}
	cout<<dp[k]<<endl;
	for(int i=1; i<=n; ++i)
		cout<<bucket[i]<<" ";
	return 0;
}
2021/5/4 17:17
加载中...