0 - 1 가방 문제 동적 계획
제목.
N 개의 아 이 템 과 V 용량 의 가방 이 있 습 니 다.제 i 물품 의 무 게 는 c [i] 이 고 가 치 는 w [i] 입 니 다.어떤 물건 을 가방 에 넣 으 면 가 치 를 총화 할 수 있 는 지 알 아 보 세 요.
기본 적 인 사고방식
이것 은 가장 기본 적 인 가방 문제 로 모든 아 이 템 이 하나 밖 에 없 으 므 로 놓 거나 놓 지 않 는 것 을 선택 할 수 있 는 것 이 특징 이다.
하위 문제 로 상 태 를 정의 합 니 다: 즉 f [i] [v] 는 앞의 i 개 아 이 템 을 v 용량 의 가방 에 넣 으 면 얻 을 수 있 는 최대 가 치 를 표시 합 니 다.그 상태 전이 방정식 은 다음 과 같다.
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
이 방정식 은 매우 중요 하 다. 기본적으로 가방 과 관련 된 모든 문제 의 방정식 은 그것 에서 파생 된 것 이다.따라서 이 를 상세 하 게 설명 할 필요 가 있다. "앞의 i 개 물품 을 v 용량 의 가방 에 넣는다" 는 문 제 는 i 개 물품 의 전략 (놓 거나 놓 지 않 는 다) 만 고려 하면 앞의 i - 1 개 물품 과 관련 된 문제 로 바 뀔 수 있다.만약 에 i 번 째 아 이 템 을 넣 지 않 으 면 문 제 는 '전 i - 1 개 아 이 템 을 v 용량 의 가방 에 넣 습 니 다' 로 바 뀌 고 가 치 는 f [i - 1] [v] 입 니 다.i 번 째 아 이 템 을 넣 으 면 문 제 는 '앞의 i - 1 아 이 템 을 남 은 용량 v - c [i] 의 가방 에 넣 기' 로 바 뀌 는데 이때 얻 을 수 있 는 가장 큰 가 치 는 f [i - 1] [v - c [i]] 와 i 번 째 아 이 템 을 넣 어 얻 을 수 있 는 가치 w [i] 이다.
단계 I (아 이 템 수량)
각 단계 의 상태: 전 i 개 아 이 템 의 총 용량 은 v 의 최대 가 치 를 초과 하지 않 습 니 다. f[i][v]
상태 전이 방정식
v 가 c [i] 보다 크 면 f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
c [i] 보다 작 을 때 f[i][v] = f[i-1][v]
경계 제어 I =0 또는 v = 0 시 f [i] [v] = 0
for i:=1 to v do f[0,i]:=0;
for i:=1 to n do f[i,0]:=0;
for i:=1 to n do
for j:=1 to v do
begin
if j>=c[i] then f[i,j]:=max(f[i-1,j-c[i]]+w[i],f[i-1,j])
else f[i,j]:=f[i-1,j];
end;
자세 한 설명:
테스트 데이터:
3 10
4 3
5 4
6 5
c [i] [j] 배열 은 1, 2, 3 번 아 이 템 을 순서대로 선택 한 최대 가 치 를 저장 합 니 다.
이 최대 가 치 는 어떻게 얻 은 것 입 니까?가방 용량 이 0 부터 1 번 아 이 템 을 먼저 시험 해 보 세 요. 0, 1, 2 의 용량 은 모두 넣 을 수 없습니다. 그래서 0, 가방 용량 이 3 이면 안에 넣 습 니 다. 이렇게 하면 이 가방 용량 이 4, 5, 6,... 10 일 때 가장 좋 은 방안 은 모두 넣 는 것 입 니 다. 만약 1 번 아 이 템 을 가방 에 넣 으 면 2 번 아 이 템 을 다시 봅 니 다. 가방 용량 이 3 일 때 가장 좋 은 방안 은 윗 줄 의 가장 좋 은 방안 c 가 4 이 고 가방 용량 이 5 일 때 입 니 다.가장 좋 은 방안 은 자신의 무게 5. 가방 용량 이 7 일 때 5 에 한 값 을 더 한 것 이 분명 하 다.누구 추가 요?7 - 4 = 3 일 때 가 분명 합 니 다. 이전 줄 c3 의 가장 좋 은 방안 은 4 입 니 다. 그래서.전체적인 가장 좋 은 방안 은 5 + 4 가 9 이다. 이렇게 일렬 로 미 루 는 것 이다.가장 오른쪽 아래 에 놓 인 데이터 가 가장 큰 가치 입 니 다.(세 번 째 줄 의 가방 용량 이 7 일 때 가장 좋 은 방안 은 그 자체 의 6 이 아니 라 이전 줄 의 9 입 니 다. 이때 3 번 아 이 템 이 선택 되 지 않 았 다 는 뜻 입 니 다. 1, 2 번 아 이 템 을 선 택 했 기 때문에 9.)
참조 코드 는 다음 과 같 습 니 다.
질문
#include <iostream>
using namespace std;
int max(int a,int b)
{
int temp=b;
if (a>b)temp=a;
return temp;
}
int main()
{
int N,V;
int sum[101][100]={0};
int i,j;
int c[100]={0},w[100]={0};
while (cin>>N>>V) {
for(i=1;i<=N;i++)cin>>c[i]>>w[i];
for(i=0;i<=N;i++)
for(j=0;j<=V;j++)
sum[i][j]=0;
cout<<" :"<<endl;
for(i=1;i<=N;i++)
for(j=1;j<=V;j++)
{
if (j>=w[i])sum[i][j]=max(sum[i-1][j],sum[i-1][j-w[i]]+c[i]);
else sum[i][j]=sum[i-1][j];
cout<<sum[i][j]<<" ";
if(j%V==0)cout<<endl;
}
cout<<" :"<<sum[N][V]<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.