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