9도 1462:두 선박 적재물 문제(01배낭)

4566 단어 문제.
제목 설명:
n개의 물품의 무게와 두 척의 적재 무게가 각각 c1과 c2인 배를 정해 이 두 척의 배로 모든 물품을 실을 수 있느냐고 물었다.
 
사고의 방향
1. 수수한 가방 질문
2. 몇 가지 세부 사항을 잘 파악해야 한다. (1) 물품의 무게를 읽을 때 물품의 최대치와 총 무게를 통계하는 것을 포함한다(2) 적재 무게가 비교적 작은 배에 대해 dp를 계산한다.
3. 1차원 dp, dp[i]는 총 물품의 무게가 i일 때의 최대 가치를 나타내기 때문에 dp[i]는 연속적이지 않기 때문에 통계 결과를 집계할 때 dp를 두루 훑어야 한다.2차원 dp[][]는 행렬을 채울 수 있다
 
코드가 9도 테스트를 통과하지 못했습니다
#include <iostream> #include <stdio.h> #include <memory.h>
using namespace std; int n, c1, c2; int wet[200]; int dp[10000]; int main() { while(scanf("%d%d%d", &n, &c1, &c2) != EOF) { int totalWeight = 0; bool exceed = false; int biggerone = max(c1, c2); for(int i = 0; i < n; i ++) { scanf("%d", wet+i); totalWeight += wet[i]; if(wet[i] > biggerone) { exceed = true; } } if(exceed) { cout << "NO" << endl; continue; } int c = min(c1, c2); memset(dp, 0, sizeof(int)*totalWeight); for(int i = 0; i < n; i ++) { for(int v = c; v >= wet[i]; v --) { dp[v] = max(dp[v], dp[v-wet[i]]+wet[i]); } } int carryone; for(int i = 0; i <= c; i ++) carryone = max(carryone, dp[i]); if(biggerone >= totalWeight-carryone) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }

좋은 웹페이지 즐겨찾기