DP 스타터 시리즈 - -01 배낭 배낭 문제

-01 배낭 배낭 문제

우리는 변화와 생각이 시간이 01 배낭에 대해 배울 수 있도록 배낭 문제는 한, 밤에 걸쳐 개최했다 내가 DFS에있는 배낭 문제에 대한 연구 마우스 DP에 사용되어왔다.
01 배낭은 무엇입니까? 그것은이 항목이 들고 문제를 고려하지 않습니다 것을 의미합니다. 결정에 직면했을 때 즉, 나는 두 가지 옵션, 걸릴하지 있습니다. 그러나 그래서 당신은 최적의 솔루션 흘끗 수없는 (최적의 솔루션을, 내가 OPT에 다음 개요를 사용합니다)에 응시하지 않고 다시 결과에 영향을 미칠 것입니다. 우리는 열거 된 모든 경우를 넣고, 선택 과정을 선택할 수 있도록, 우리는 많은 문제를 가지고 우리는 상태 전이 충분히이 문제를 해결하는 방법을 고려할 수 있도록, 물론, DP에 대한 문제는 이중 계산이다.
첫째, 블로그 사이트 추천 DP 초보자 필수, WOC 너무 Niubi을! ! ! QAQ
그래서이의 오늘 우리를 나타 내기 위해 커튼을 들고 제목을 보자.

제목 설명

N 항목 V와 배낭의 용량이 있습니다. 각 항목은 한 번만 사용할 수 있습니다. 볼륨 i 번째 항목 VI, 값 (WI)이다. 어느 가방에 항목을 해결하는 이러한 항목의 총 부피는 배낭의 용량 및 최대의 총 값을 초과 할 수 없다. 최대 출력값.

입력 형식

각각 공간에 의해 분리 된 두 정수 N, V의 첫 번째 라인 및 기사 배낭 볼륨의 수. N 열, 각 행의 두 정수 VI, WI, 각각 공간으로 구분하고, 상품의 i 번째 값의 부피가있다 다운.

출력 형식

최대 값을 나타내는 출력 할 정수.

데이터 범위

0 <N, V≤1000
0 <우리 wi≤1000

샘플 입력

4 5
1 2
2 4
3 4
4 5

샘플 출력

8

제출

OK 우리는 이해하고 문제를 해결하기 위해 두 가지 방법을 사용합니다.
첫째, 배낭 문제는 문제에 대한 선거가 아니라 투표는 우리가 책 뒤에 공간이 남아있는 값의 선택한 각 최대 사용을 공부해야하므로 선출 된 경우는 배낭 볼륨을 줄일 수, 값이 증가 할 것입니다.

그래서 우리는 나머지 공간에, 우리는 최적의 솔루션을 찾을 얼마나 남아있는 공간에서 시작해야한다.
그래서 생각 시작 1에서 남아있는 공간을하자 이들 여섯 (공간이 남아있는 사건의 여섯 종류의 총이 각각 0,1,2,3,4,5이다), 나머지 공간의 각각의 마지막 남은 공간에 의해 결정됩니다, 이 문서의 잔여 존재의 존재는, 그 값이 작은 항목의 현재 값보다이 선택되지 않습니다.

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int f[1010][1010];
int n,m;
int v[10000],w[10000];
int main()
{
 cin>>n>>m;
 for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
 for(int i=1;i<=n;i++)
 for(int j=0;j<=m;j++)
 {
  f[i][j]=f[i-1][j];
  if(j>=v[i])
  f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
 }
 int res=0;
 for(int i=0;i<=m;i++)res=max(res,f[n][i]);
 cout<<res<<endl;
 return 0;
 } 

그가 지금 모든 것을 넣어 것입니다 보류가 전송되는 다른 차원들 사이 다른 차원에 배치되기 때문에 문제의 반복 배치에 대한 이야기는, 현재 상태를 반복에 가능성이 나타나지 배치됩니다.
그래서 배치를 반복하는 문제가 없습니다.
그러나, 1 차원 배열은 그러한 경우가 있다면.
광 출력의 1 차원 배열의 코드 여기

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int w[1010],v[1010];
int f[200000];
int main()
{
 int n,m;
 cin>>n>>m;
 for(int i=0;i<n;i++)cin>>w[i]>>v[i];
 for(int i=n;i>=0;i--)
 for(int j=m;j>=w[i];j--)
  f[j]=max(f[j],f[j-w[i]]+v[i]);
  cout<<f[m]<<endl;
 } 

나는 긍정적 인 순서가 있다면, 다음 배치 이전 기사를 반복 할 수있을 것입니다, 때문에 내 코드는 역순으로 순환되어 있습니다. 당신이 반대 방향으로 이동하면 각 업데이트를 통해 전송되는 개체의 상태를 기반으로하기 전에, 다음, 두지 않았다. 그래서 문제가 반복되지가 없을 것입니다. 당신이이 업데이트를 기반으로 업데이트 한 경우 그래서, 그는이 배치 항목을 반복 할 것 같다!
부산물 휠 달

게시 32 개 원래 기사 · 원의 찬양 (12) · 전망 1195

추천

출처blog.csdn.net/qq_35339563/article/details/103580729