列表

详情


NC208016. 小梁的背包

描述

小梁来到了伽勒尔地区并参加了联盟赛热身赛,比赛小岛上有个精灵散落在岛上各处,她有一个大小为的背包,每个精灵的战斗值为v_i,体积为w_i
请问在她临走之前背包内宝可梦的战斗力总和最多为多少,并输出其战斗值总和以及背包内的精灵数量

输入描述

输入一个整数表示测试组数
每组数据的第一行有两个整数
接下来有n行数据,每行两个代表宝可梦体积w_i和战斗值

输出描述

输出T组,每组一行

示例1

输入:

1
5 5 
1 3 
2 5 
1 2
4 2
6 1

输出:

10 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 512K, 提交时间: 2020-06-20 16:57:30

#include<iostream>
#include<cstring>
using namespace std;
int t;
int n,s;
int main(){
	cin>>t;
	while(t--){
		cin>>n>>s;
		int w[10005],v[10005];
		int dp[10005];
		int ans[10005];
		memset(ans,0,sizeof(ans));
		memset(dp,0,sizeof(dp)); 
		for(int i=1;i<=n;i++){
			cin>>w[i]>>v[i];
		}
		for(int i=1;i<=n;i++){
			for(int j=s;j>=w[i];j--){
				if(dp[j]<dp[j-w[i]]+v[i]){
					dp[j]=dp[j-w[i]]+v[i];
					ans[j]=ans[j-w[i]]+1; 
				}
			}
		} 
		cout<<dp[s]<<" "<<ans[s]<<endl;
	}
}

C++(g++ 7.5.0) 解法, 执行用时: 14ms, 内存消耗: 572K, 提交时间: 2023-05-16 21:54:10

#include<bits/stdc++.h>
using namespace std;
#define N 10005
int t,n,s,w[N],v[N],dp[N],cnt[N];
int main(){
	cin>>t;
	while(t--){
		memset(cnt,0,sizeof(cnt));
		cin>>n>>s;
		for(int i=1;i<=n;i++){
			cin>>w[i]>>v[i];
		}
		for(int i=0;i<=s;i++){
			dp[i]=0;
		}
		for(int i=1;i<=n;i++){
			for(int j=s;j>=w[i];j--){
				if(dp[j]<dp[j-w[i]]+v[i]){
					dp[j]=dp[j-w[i]]+v[i];
					cnt[j]=cnt[j-w[i]]+1;
				}
			}
		}
		cout<<dp[s]<<" "<<cnt[s]<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 12ms, 内存消耗: 792K, 提交时间: 2020-06-22 22:14:37

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int i,a,b,n,s,T,DP[10005],num[10005];
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&s);
		memset(DP,0,sizeof(DP)),memset(num,0,sizeof(num));
		while(n--)
		{
			scanf("%d%d",&a,&b);
			for(i=s;i>=a;i--)
			{
				if(DP[i]>=DP[i-a]+b)continue;
				DP[i]=DP[i-a]+b,num[i]=num[i-a]+1;
			}
		}
		printf("%d %d\n",DP[s],num[s]);
	}
}

上一题