P2392 kkksc03考前临时抱佛脚 (01背包)

洛谷2392

题目算是01背包问题的变种吧,相当于给你4个背包容量为sum/2的背包,求最大的价值,因为我们要求所花费的最小时间,所以可以先求出距离sum/2最近的最大价值。其中体积和价值都是所要花费的时间。

#include
using namespace std;
int a[5],i,j,k,sum,t,homework[21],dp[2501];
int main(){
	for(i=1;i<=4;i++)
		cin>>a[i];
	for(i=1;i<=4;i++){
		sum=0;	
		for(j=1;j<=a[i];j++)
		 {
		 	cin>>homework[j];
			sum+=homework[j];
		 }       
			
		for(j=1;j<=a[i];j++)
			for(k=sum/2;k>=homework[j];k--)
				dp[k]=max(dp[k],dp[k-homework[j]]+homework[j]);
		t+=sum-dp[sum/2];
		for(j=1;j<=sum/2;j++)
		dp[j]=0;
	}
	cout<<t;
	return 0;
}

你可能感兴趣的:(DP)