分析:
状态转移方程:
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