여러 배낭 문제 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 백팩 방법을 사용합니다.
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;
}