首页 > 其他 > 详细

【codevs1014/1068】背包型动态规划

时间:2015-11-30 14:37:08      阅读:289      评论:0      收藏:0      [点我收藏+]

分析:

状态转移方程:

  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;
}
  

  

【codevs1014/1068】背包型动态规划

原文:http://www.cnblogs.com/flipped/p/5006972.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!