庆功会那位大佬会?教教我

庆功会
题目描述

八(1)班由于在期中考中获得了团体第一名,班主任吴老师决定开一场庆功会。于是购买东西的任务就交给了小李同学(钱由班会出)。由于小李同学四肢发达,头脑简单,于是这个任务便落到了你头上(当然不要你跑腿。跑腿是小李的事 ^_^)注:可以全买,但不能不买。即至少买1种

输入格式

第一行二个数n(n<=500),m(m<=5000),其中n代表希望购买的物品的种数,m表示班会拨给小李的钱数。接下来n行,每行3个数,v、w、s,分别表示第I种物品的价格、价值(价格 与 价值 是不同的概念)和购买数量(只能买0件或s件),其中v<=100,w<=1000,s<=10

输出格式

共两行:第一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。第二行:小李此次购买(能获得的最大价值)所选择的物品种类的序号

样例

Input 1

5 1000
80 20 4
40 50 9
30 50 7
40 30 6
20 20 1

Output 1

1000
2 3 4 5

样例解释

输入第一行5 1000代表有5种物品,最多可以花1000元。下一行是每种物品的价值,价格和购买数量。最后的输出1000 2 3 4 5表示最大价值是1000,购买了第2、3、4、5种物品。

数据范围

见题目

4 个赞

同问+1

5 个赞

老师上课没讲吗?

4 个赞

应该是dp,好像是多组背包,可以用01背包,但可能会超时,希望能帮到你

3 个赞

现在我把代码发你:

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=5e3+7;

int n,m;
int dp[N][N];
int c[N],w[N];
int vis[5007];
signed main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>w[i]>>c[i]>>x;
		w[i]*=x;
		c[i]*=x;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(j>=w[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
			else dp[i][j]=dp[i-1][j];
		}
	}
	cout<<dp[n][m]<<"\n";
	for(int j=m;j>=0;j--){
		for(int i=n;i>=1;i--){
			if(dp[i][j]!=dp[i-1][j]){
				vis[i]++;
				j-=w[i];
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(vis[i]!=0) cout<<i<<" ";
	}
	return (0);
}
[poll type=regular results=always chartType=bar]
* 我是:全部抄袭!!!
* 我是:部分抄袭!!
* 我是:一点懂了!
* 我是:全部懂了(最希望是这种)
[/poll]

4 个赞
  • 抄袭!
  • 不抄袭!!
0 投票人

你选哪个???

3 个赞

大佬给个思路!一些代码看不懂QwQ

2 个赞

题目描述

时间:0. 1s 空间: 128 M

题目描述:

为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。

输入格式:

第一行二个数n(n<=500),m(m<=6000),其中n代表希望购买的奖品的种数,m表示拨款金额。

接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和购买的数量(买0件到s件均可),其中v<=100,w<=1000,s<=1000。

输出格式:

第一行:一个数,表示此次购买能获得的最大的价值。

样例输入1:

5 1000
80 20 4
40 50 9
30 50 7
40 30 6
20 20 1

样例输出1:

1040

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,num,cnt,w[5114],v[5114],s[5114],dp[6514];
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>a>>b>>num;
		for(int j=1; j<=num; j*=2) {
			num-=j;
			w[++cnt]=a*j;
			v[cnt]=b*j;
		}

		if(num) {
			w[++cnt]=a*num;
			v[cnt]=b*num;
		}
	}
	for(int i=1; i<=cnt; i++) {
		for(int j=m; j>=w[i]; j--) {
			if(j>=w[i])
				dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<<dp[m];
	return 0;
}

想想区别

3 个赞

2 个赞