货物处理(dp)

这里写图片描述
这里写图片描述
C题
背包问题。
dp[i][j]表示在前i件物品,前j分钟内花费最多的时间。

#include<iostream>
#include<cstring>
using namespace std;
int T,n,ai,bi,t[200],total,dp[200][20000],p;
int max(int a,int b){return a>b?a:b;}
int main(){
    cin>>T;
    while(T--){
        memset(t,0,sizeof(t));
        memset(dp,0,sizeof(dp));
        p=0;
        total=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>ai>>bi;
            for(int j=1;j<=bi;j++){
                t[++p]=ai;
                total+=ai;
            }
        }
        for(int i=1;i<=p;i++){
            for(int j=1;j<=(total>>1);j++){
                if(j-t[i]>=0){
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+t[i]);
                }
                else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        cout<<total-dp[p][total>>1]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/80050968
今日推荐