그룹 가방 테마
35973 단어 dp
그룹 가방 테마
해석
제목 배경: 아이템은 여러 조로 나뉘어져 있으며, 각 조는 하나의 해결 방법만 선택할 수 있습니다. 아래 코드 참조
T1 HDU1712
문제풀이
조별 배낭판
코드
#include
#define M 109
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1;ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int n,m,f[M],a[M][M];
int main(){
while(scanf("%d%d",&n,&m)){
if(!n&&!m) break;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) a[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=m;k++)// ,
if(j>=k) f[j]=max(f[j],f[j-k]+a[i][k]);
printf("%d
",f[m]);
}return 0;
}
T2 HDU3033
문제풀이
엄밀히 말하면 본 문제는 조별 배낭에 속하지 않고 조당 하나만 선택할 수 있는 제한이 없다. 반대로 조당 최소한 하나를 선택하는 제한이 있다.그러면 바로'f[i] [j] [j] = m a x (f[i] [j], f [i] [i] [j] [j] [i] [k]] + a [i] [k] + a [i] [i] [f[i] [i] [j] [k] + [k] [k] max(f[i][j], f[i][j-w[i][k]]+a[i][k], f[i-4.1][j-w[i][k]]]+a[i][k]f[i][j]f[i][j][j]f[j]f[i][j][j]전 iii조 물품이 jjj 용량을 써서 얻은 최대 가치를 나타낸다. w[i][k]w[i][k]w[i][k]는 ii조에서 kk조 물품의 무게를 나타낸다. v[i][k]v[k]v[i][k]는 ii조에서 kk 물품의 가치를 나타내는 동시에 초기화에 주의해야 한다. 왜냐하면 시작 상태를 제외하고 나머지 상태는 모두 비합법적인 상태이기 때문이다.
코드
#include
#define M 100009
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int f[12][M],a[12][M],n,m,tot[12],k,b[12][M],w;
int main(){
while(~scanf("%d%d%d",&n,&m,&w)){
memset(tot,0,sizeof(tot));
for(int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
a[x][++tot[x]]=y,b[x][tot[x]]=z;
}memset(f,-1,sizeof(f));
for(int i=1;i<=m;i++) f[0][i]=0;
for(int i=1;i<=w;i++)
for(int k=1;k<=tot[i];k++)
for(int j=m;j>=0;j--){
if(a[i][k]<=j&&f[i][j-a[i][k]]!=-1)
f[i][j]=max(f[i][j],f[i][j-a[i][k]]+b[i][k]);
if(a[i][k]<=j&&f[i-1][j-a[i][k]]!=-1)
f[i][j]=max(f[i][j],f[i-1][j-a[i][k]]+b[i][k]);
}
if(f[w][m]<0) printf("Impossible
");
else printf("%d
",f[w][m]);
}return 0;
}
T3 P1757
문제풀이
조별 배낭판
코드
#include
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1;ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int m,n,w[109][1009],f[50009],v[109][1009],tot[109],k;
int main(){
m=read(),n=read();
for(int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
w[z][++tot[z]]=x,v[z][tot[z]]=y;
k=max(k,z);
}
for(int i=1;i<=k;i++)
for(int k=m;k>=0;k--)
for(int j=1;j<=tot[i];j++)
if(k>=w[i][j]) f[k]=max(f[k],f[k-w[i][j]]+v[i][j]);
printf("%d
",f[m]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)
의 해설 기사입니다.
해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다.
※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다.
문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
#define M 109
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1;ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int n,m,f[M],a[M][M];
int main(){
while(scanf("%d%d",&n,&m)){
if(!n&&!m) break;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) a[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=m;k++)// ,
if(j>=k) f[j]=max(f[j],f[j-k]+a[i][k]);
printf("%d
",f[m]);
}return 0;
}
#include
#define M 100009
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int f[12][M],a[12][M],n,m,tot[12],k,b[12][M],w;
int main(){
while(~scanf("%d%d%d",&n,&m,&w)){
memset(tot,0,sizeof(tot));
for(int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
a[x][++tot[x]]=y,b[x][tot[x]]=z;
}memset(f,-1,sizeof(f));
for(int i=1;i<=m;i++) f[0][i]=0;
for(int i=1;i<=w;i++)
for(int k=1;k<=tot[i];k++)
for(int j=m;j>=0;j--){
if(a[i][k]<=j&&f[i][j-a[i][k]]!=-1)
f[i][j]=max(f[i][j],f[i][j-a[i][k]]+b[i][k]);
if(a[i][k]<=j&&f[i-1][j-a[i][k]]!=-1)
f[i][j]=max(f[i][j],f[i-1][j-a[i][k]]+b[i][k]);
}
if(f[w][m]<0) printf("Impossible
");
else printf("%d
",f[w][m]);
}return 0;
}
#include
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1;ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int m,n,w[109][1009],f[50009],v[109][1009],tot[109],k;
int main(){
m=read(),n=read();
for(int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
w[z][++tot[z]]=x,v[z][tot[z]]=y;
k=max(k,z);
}
for(int i=1;i<=k;i++)
for(int k=m;k>=0;k--)
for(int j=1;j<=tot[i];j++)
if(k>=w[i][j]) f[k]=max(f[k],f[k-w[i][j]]+v[i][j]);
printf("%d
",f[m]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.