여러 배낭 문제 1

여러 배낭 문제 1


acwing 4에서
시간 제한 : 1 초
공간 제한 : 64MB

제목 설명:

N 개의 아이템과 V 용량의 배낭이 있습니다.

i 번째 항목에는 최대 si 항목이 있으며, 각 항목의 볼륨은 vi이고 값은 wi입니다.

배낭에 어떤 항목이 적재되었는지 확인하여 항목의 총 부피가 배낭의 용량을 초과하지 않고 총 값이 가장 큽니다.
최대 값을 출력합니다.

입력 형식 :

첫 번째 줄의 두 정수 N과 V는 각각 개체 수와 배낭의 부피를 나타내는 공백으로 구분됩니다.

다음으로, 각각 공백으로 구분 된 세 개의 정수 vi, wi, si가있는 N 개의 행이 있으며, 이는 i 번째 항목의 볼륨, 값 및 수량을 나타냅니다.

출력 형식:

최대 값을 나타내는 정수를 출력합니다.

데이터 범위 :

0 <N, V <= 100

0 <vi, wi, si <= 100

입력 샘플 :

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

샘플 출력 :

10

이 문제는 dp 2 차원 배열로 완료 할 수 있지만 최적화를 수행하면 배열을 1 차원 배열로 열 수 있으며 각 제품 작업에 대해 백팩을 뒤에서 앞으로 새로 고치는 것으로 충분합니다.

01 백팩을 기준으로이 주제에 대한 각 제품에 대해 여러 항목이있을 수 있습니다. 예를 들어, 이러한 제품이 세 개있는 경우 세 가지 다른 제품으로 취급하고 01 백팩 방법을 사용합니다.

01 배낭 문제

1 차원 :
#include<iostream>
using namespace std;
int N,V,dp[105];           //dp是状态数组,表示背包在某个容量目前能装下的最多价值
int main(){
    
    
    cin>>N>>V;
    for(int i = 1;i <= N;++i){
    
    
        int a,b,c;cin>>a>>b>>c;  //商品的体积和价值
        while(c--)
            for(int j = V;j >= a;--j)
                if(dp[j] < dp[j - a] + b)   //如果在此时装入该物品,价值会提升,那么就装入
                    dp[j] = dp[j - a] + b;
    }
    cout<<dp[V];
    return 0;
}
2 차원 :
#include<iostream>
#include<algorithm>
using namespace std;
int vi[10005];
int wi[10005];
int dp[10005][105];
int main(){
    
    
	int n,v,k = 0,a,b,c;
	cin>>n>>v;
	for(int i = 1;i <= n;i++){
    
    
		cin>>a>>b>>c;
		while(c--){
    
    
			vi[++k] = a;
			wi[k] = b;
		}
	}
	n = k;
	for(int i = 1; i <= n;i++)
		for(int j = 1;j <= v;j++){
    
    
			if(j < vi[i])
				dp[i][j] = dp[i - 1][j];
			else{
    
    
				dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - vi[i]] + wi[i]);
			}
		}
	cout<<dp[n][v];
	return 0;
} 

추천

출처blog.csdn.net/qq_45985728/article/details/113596954