20250725题解

首页 排名 提交记录 题目列表 测试比赛 教师频道 正版书籍 关于

1267:【例9.11】01背包问题


时间限制: 1000 ms         内存限制: 65536 KB
提交数:71918    通过数: 43491

【题目描述】

一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,...,Cn,求旅行者能获得最大总价值。

【输入】

第一行:两个整数,MM(背包容量,M≤200M≤200)和NN(物品数量,N≤30N≤30);

第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。

【输出】

仅一行,一个数,表示最大总价值。

【输入样例】

10 4
2 1
3 3
4 5
7 9

【输出样例】

12

提交 统计信息 提交记录


本题库与《信息学奥赛一本通(C++版)》(南京大学出版社)配套。
本网站属公益、非盈利性质,不涉及与书相关的商业活动。
蜀ICP备2024068936号-2  联系我们: [email protected]  [email protected]
     网站使用规则
网站用户协议
#include 
using namespace std;
int n,m;
int w[35],v[35];
int dp[35][210];
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++)cin>>w[i]>>v[i];
	for(int i=1;i<=n;i++)
		for(int j=0;j<=m;j++){
			if(j

 01背包问题

先读取背包容量`M`和物品数量`N`。
然后读取每个物品的重量W[i]和价`v[i]。

中间用公式  dp[i][j]=dp[i-1][j];  dp[i][j]=max(dp[i-1][j],v[i]+dp[i-1][j-w[i]]);
最终dp[M]就是背包容量为`M`时的最大价值。

题目描述
你有一架天平和 N 个砝码, 这 N 个砝码重量依次是 W 
1
?
 ,W 
2
?
 ,?,W 
N
?
  。 请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

输入格式
输入的第一行包含一个整数 N 。

第二行包含 N 个整数: W 
1
?
 ,W 
2
?
 ,W 
3
?
 ,?,W 
N
?
  。

输出格式
输出一个整数代表答案。

输入输出样例
输入 #1复制

3
1 4 6
输出 #1复制

10
说明/提示
【样例说明】

能称出的 10 种重量是: 1、2、3、4、5、6、7、9、10、11 。

?
  
1=1
2=6?4( 天平一边放 6, 另一边放 4) 
3=4?1
4=4
5=6?1
6=6
7=1+6
9=4+6?1
10=4+6
11=1+4+6
?
 
【评测用例规模与约定】

对于 50% 的评测用例, 1≤N≤15 。

对于所有评测用例, 1≤N≤100,N 个砝码总重不超过 10 
5
 。

蓝桥杯 2021 第一轮省赛 A 组 F 题(B 组 G 题)。

#include 
using namespace std;
long long dp[105][100005];
long long w[105];
int main(){
	long long n,cnt=0;
	cin>>n;
	dp[0][0]=1;
	for(int i=1;i<=n;i++)cin>>w[i];
	for(int i=1;i<=n;i++){
		for(int j=0;j<=1e5;j++){
			if(dp[i-1][j]==1)dp[i][j]=1;
			if(j+w[i]<=1e5&&dp[i-1][j+w[i]]==1)dp[i][j]=1;
			if(dp[i-1][abs(j-w[i])]==1)dp[i][j]=1;
		}
	}
	for(int j=1;j<=1e5;j++)cnt+=dp[n][j];
	cout<

所有变量都要用long long类型

你可能感兴趣的:(算法)