uva12563

时间:2022-11-23 13:54:32

一个简单的0-1背包,背包容量为t-1,每个物品价值为1,代价为t[i]。背包容量为t-1而不是t的原因是留1s唱《劲歌金曲》。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=180*50+678+5;
struct node{
	int len,tim;
	node(){
	}
	node(int l,int t):len(l),tim(t){
	}
}dp[55][maxn];

int a[55];
int n,t;
int main(){
	int T,kase=0;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&t);
		for(int i=1;i<=n;++i)
			scanf("%d",&a[i]);
		memset(dp[0],0,sizeof(dp[0]));
		for(int i=1;i<=n;++i)
		for(int j=0;j<t;++j){
			if(i==1) dp[i][j]=node(0,0);
			else dp[i][j]=dp[i-1][j];
			if(j>=a[i]){
				if(dp[i-1][j-a[i]].len+1>dp[i][j].len) {
					dp[i][j].len=dp[i-1][j-a[i]].len+1;
					dp[i][j].tim=dp[i-1][j-a[i]].tim+a[i];
				}
				else if(dp[i-1][j-a[i]].len+1==dp[i][j].len){
					dp[i][j].tim=max(dp[i-1][j-a[i]].tim+a[i],dp[i][j].tim);
				}
			}

		}
		printf("Case %d: ",++kase);
		printf("%d %d\n",dp[n][t-1].len+1,dp[n][t-1].tim+678);
	}
	return 0;
}

可以用滚动数组优化内存。

可能我的代码思路不是很简洁明了,附上汝佳大哥的代码汝佳大哥代码

如有不当之处欢迎指出。

相关文章