AT_dp_d Knapsack 1题解

题目描述

有 N 个物品。每个物品编号为 1,2,…,N。对于每个 i(1≤i≤N),物品 i 的重量为 wi​,价值为 vi​。

太郎君打算从这 N 个物品中选择一些,放入背包带回家。背包的容量为 W,所选物品的总重量不能超过 W。

请你求出太郎君能带回家的物品的最大总价值。

输入格式

输入通过标准输入按以下格式给出。

N W w1​ v1​ w2​ v2​ … wN​ vN​

输出格式

输出太郎君能带回家的物品的最大总价值。

显示翻译

题意翻译

输入输出样例

输入 #1复制

3 8
3 30
4 50
5 60

输出 #1复制

90

输入 #2复制

5 5
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000

输出 #2复制

5000000000

输入 #3复制

6 15
6 5
5 6
6 4
6 6
3 5
7 2

输出 #3复制

17

说明/提示

限制条件

  • 所有输入均为整数。
  • 1≤N≤100
  • 1≤W≤105
  • 1≤wi​≤W
  • 1≤vi​≤109

样例解释 1

选择物品 1 和 3 即可。此时总重量为 3+5=8,总价值为 30+60=90。

样例解释 2

答案可能超过 32 位整数的范围。

样例解释 3

选择物品 2,4,5 即可。此时总重量为 5+6+3=14,总价值为 6+6+5=17。

由 ChatGPT 4.1 翻译

思路

背包DP。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long eee,n,m,jkj,lll=0,n17,u23,a,s2[10000001],ni[120][101],nj[101],nk[101],b[100001],c[54],d[100001],k,kkk,p,ss[100001][51],sd[100001],sw,t,z0,z1,u0,sc,s0,sm,sx;
long long n8[101][101],n4[100101012];

struct ll{
	int s,e;
}z[10000001];
ll z2[10000001],z3[10000001],zx[10000001];
bool cmp(ll a,ll b){
	return a.s<b.s;
}
bool cmp2(ll a,ll b){
	return a.e<b.e;
}
bool cmp3(ll a,ll b){
	return a.e-a.s<b.e-b.s;
}
int main(){
	//map<long long,long long> n4;
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>s2[i]>>sd[i];
		jkj+=sd[i];
	}
	n4[0]=1;
	for(long long i=1;i<=n;i++){
		for(long long j=jkj-sd[i];j>=0;j--){
			if(n4[j]>=1){
				if(n4[j+sd[i]]>0) n4[j+sd[i]]=min(n4[j+sd[i]],n4[j]+s2[i]);
				else n4[j+sd[i]]=n4[j]+s2[i];
			}
		}
	}
	for(long long i=1e7;i>=0;i--){
		if(n4[i]!=0&&n4[i]<=m+1){
			cout<<i;
			break;
		}
	}
	return 0;
}

posted @ 2025-10-22 20:57  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源