Coins (hdu 2844) 다중 가방

1662 단어 dp다중 배낭
오늘 다중 배낭을 다시 배워 선발전을 준비했다.
이 문제는 신키보드에 있는 댄서의 틀을 배웠습니다. 감사합니다~
이 문제는 간단한 다중배낭으로 이 동전을 완전배낭으로 할지 01배낭으로 할지 판단하고, 01배낭은 2진법으로 간소화한다.
제목은 모두 몇 가지의 price를 표시할 수 있는지 구하는 것입니다. 여기서 답안은 dp[i]==i로 판단합니다. 원인은 다음과 같습니다.
이 문제는 모두 0으로 초기화되었다. 즉, 가득 채우지 않고 최대를 구하는 것이다. 동전은 배낭 용량을 대표하는 동시에 배낭 안의 값이기도 하다.dp[i] 즉 최대 용량이 i일 때 i를 담는 것이 가장 크고 dp[i]의 값이 i와 같지 않으면 가득 채우지 못했다는 뜻이다. 즉, dp[dp[i]=dp[i]가 있기 때문에 모든 price가 dp[price]에 나타나기 때문에 이렇게 결과를 구한다.
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;
int n,m;
int v[110];
int t[110];
int dp[100010];
void MP(int value,int space,int num);
int main(){

	scanf("%d%d",&n,&m);
	while(n||m){
		for(int i=0;i<n;i++){
			scanf("%d",&v[i]);
		}
		for(int i=0;i<n;i++){
			scanf("%d",&t[i]);
		}
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++){
			MP(v[i],v[i],t[i]);
		}
		int sum = 0;
		for(int i=1;i<=m;i++){
			if(i==dp[i])	sum++;
		} 
		printf("%d
",sum); scanf("%d%d",&n,&m); } return 0; } // void CP(int value,int space){ for(int i=value;i<=m;i++){ dp[i] = max(dp[i],dp[i-value] + space); } } //01 void ZOP(int value,int space){ for(int i=m;i>=value;i--){ dp[i] = max(dp[i],dp[i-value] + space); } } // void MP(int value,int space,int num){ if(num*value>=m){// CP(value,space); } else{// int k=1; while(k<=num){ ZOP(value*k,space*k); num-=k; k*=2; } ZOP(value*num,space*num); } }

좋은 웹페이지 즐겨찾기