分析:
状态转移方程:
v[j]=max(v[j],v[j-a[i]]+a[i]) (j ← tol downto a[i])
/* 作者:flipped 题目:p1014 装箱问题 */ #include<iostream> #include<algorithm> using namespace std; int main(){ int n,tol; int a[40],v[20005]={0},used[40]={0}; cin>>tol>>n; for(int i=0;i<n;i++) { cin>>a[i]; for(int j=tol;j>=a[i];j--){ v[j]=max(v[j],v[j-a[i]]+a[i]); } } cout<<tol-v[tol]; return 0; }
分析:
状态转移方程:
dp[i][j][k][t]=max{dp[i-1][j][k][t],dp[i][j-1][k][t],dp[i][j][k-1][t],dp[i][j][k][t-1]}+score[i*1+j*2+k*3+t*4]
/* 作者:flipped 题目:p1068 乌龟棋 */ #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; const int maxcardnum=40+5,maxcardtype=4+1,maxstep=350+5; int score[maxstep],card[maxcardtype]={0}; int dp[maxcardnum][maxcardnum][maxcardnum][maxcardnum]; int n,m,tmp; int main() { cin>>n>>m; for(int i=0;i<n;i++)cin>>score[i]; for(int i=0;i<m;i++){ cin>>tmp; card[tmp]++; } for(int i=0;i<=card[1];i++) for(int j=0;j<=card[2];j++) for(int k=0;k<=card[3];k++) for(int t=0;t<=card[4];t++){ tmp:int a=0,b=0,c=0,d=0; if(i) a=dp[i-1][j][k][t]; if(j) b=dp[i][j-1][k][t]; if(k) c=dp[i][j][k-1][t]; if(t) d=dp[i][j][k][t-1]; //找到退一步的分数 dp[i][j][k][t]=max(max(a,b),max(c,d))+score[i*1+j*2+k*3+t*4]; } cout<<dp[card[1]][card[2]][card[3]][card[4]]; return 0; }
原文:http://www.cnblogs.com/flipped/p/5006972.html