01 가방 페이지 레이아웃

2365 단어 잡담
문제가 발생했습니다. 폭이 고정된div, 2줄, 20열 (너비는 20글자를 수용합니다).줄 안에 이미 있는 단어의 길이 + 현재 넣을 단어의 길이 > 20이 있으면 넣을 단어는 두 번째 줄에 넣습니다.
단어는 데이터베이스에서 얻어지고 한 단어의 리스트 집합을 얻을 수 있다.그렇다면 리스트에 있는 단어를 모두div에 넣으면div의 크기를 초과할 수 있고, 선택적으로div를 넣으면div의 크기를 어떻게 선택해야 최대한 활용할 수 있는지 문제가 생겼다.div의 개수가 매우 많기 때문에 인공 방법은 가능한 한 고려하지 않는다.만약list의 순서대로div를 넣고 현재 길이를 N에 저장하여 유지보수를 진행한다면, 먼저 길이 2의 요소를 넣고, 두 번째 요소의 길이는 19이다. 이때 다음 줄로 출력해야 합니까? 아니면 계속 적당한 요소를 찾아 첫 줄에서 출력해야 합니까?어떻게 공간 이용의 최대화를 보장합니까?
관객들에게 좋은 방안이 있을지 모르겠지만, 내가 지금 생각할 수 있는 것은 01배낭밖에 없다.유지보수 그룹re[i][j]는 i개의 선택된 단어를 j 길이의div에 넣는 총 단어의 길이를 저장합니다.먼저 1 행위로 예를 들면 두 줄은 첫 번째 줄의 작업을 중복할 수 있다.
i개 단어를 j에 넣은 div의 총 단어 길이는re[i][j],re[i][j]=max{re[i-1][j],re[i-1][j-length[i]]]+length[i]}이다.사람 말로는 i개의 대명사를 j 길이의div에 넣는 총어장=i-1개의 대명사를 j 길이의div에 넣는 총어장과 i-1개의 단어를 j 길이의div에 넣을 때의 총어장+i개의 단어의 길이다.리[i][j]의 상태는 그의 이전 상태와 관련이 있기 때문에 만약에 첫 번째 단어가 들어가지 않았다면 그의 이전 상태는 리[i-1][j]이다. 들어가지 않았기 때문에 전체적인div는 변화할 필요가 없다.만약 i번째 단어를 넣었다면, 이전 상태는 분명히 r[i-1][j-length[i]였다.length[i]는 i번째 단어의 단어 길이입니다.
다음은 코드와 주석입니다. 한 줄의div만 한 경우 두 줄은 다시 한 번 뛰거나 길이의 구조 변화 여부를 판단하여 부분 코드를 다시 뛸 수 있습니다.
package dp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List src = Arrays.asList(new String[]{"good","the","manage","test","for","new","goodIdea","dd","na","sa"});
		int clumnNum = 13;
		System.out.println(dodp(src, clumnNum));
	}
	/**re        i    ,v  
	 * re[i][v] = max{re[i-1][v],re[i-1][v-l[i]]+l[i]}
	 * @param src
	 * @param clumnNum
	 * @return
	 */
	public static List dodp(List src,int clumnNum){
		int[][] re = new int[src.size()+1][clumnNum+1];
		for(int i=0;i result = new ArrayList();
		for(int i=1;i=src.get(i-1).length()){
				int a = re[i-1][j];
				int b = re[i-1][j-src.get(i-1).length()]+src.get(i-1).length();
				if(a0;k--){
			if(re[k][m]>re[k-1][m]){
				result.add(src.get(k-1));
				m -= src.get(k-1).length();
			}
		}
		return result;
	}
}

더 나은 해결책이 있을거야

좋은 웹페이지 즐겨찾기