HDU 3496 Watch The Movie
2014-11-09 17:06
141 查看
/* n个里选m个,把m也看作一个背包,共有m个可以用 但用 [m][l]表示数组太大,可以考虑去掉 ,因为dp过程不断取最大值就可以了, 其实不需要 dp[i][j]:用i部动画,j时间能取得的最大值 dp[i][j]=max{dp[i-1][j-t[k]]+v[k]} */ #include<stdio.h> #include<string> #define N 105 #define L 1005 const int INF=1<<30; int n,m,l; int v ,t ; int dp [L]; int max(int a,int b) { return a>b?a:b; } void solve() { memset(dp,0,sizeof(dp)); int i,j,k; for(i=0;i<=m;i++) { for(j=0;j<=l;j++) { //要求恰好m个,[i]初始化为0,其余为-INF if (i==0) dp[i][j]=0; else dp[i][j]=-INF; } } for(i=0;i<n;i++) { //01背包,从后往前推才能保证每个物品只取一次 for(j=m;j>0;j--) { for(k=l;k>=t[i];k--) { dp[j][k]=max(dp[j][k],dp[j-1][k-t[i]]+v[i]); } } } if (dp[m][l]<0) printf("0\n"); else printf("%d\n",dp[m][l]); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int T,i; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&l); for(i=0;i<n;i++) { scanf("%d%d",&t[i],&v[i]); } solve(); } }
相关文章推荐
- hdu 3496 Watch The Movie(二维背包)
- HDU_3496 Watch The Movie (背包)
- hdu 3496 Watch The Movie(DP)
- hdu 3496 Watch The Movie(二维费用背包)
- HDU - 3496 - Watch The Movie
- HDU 3496 Watch The Movie
- hdu 3496 Watch The Movie (二维背包)
- hdu 3496 Watch The Movie
- hdu 3496 Watch The Movie
- HDU 3496 Watch The Movie
- HDU 3496 Watch The Movie
- hdu 3496 Watch The Movie 二维费用背包
- hdu 3496 Watch The Movie(DP)
- hdu 3496 Watch The Movie(二维01背包)
- HDU 3496 - Watch The Movie
- hdu 3496 Watch The Movie(分组背包)
- HDU 3496 Watch The Movie【二维背包】
- hdu 3496 Watch The Movie (二维背包简单题)
- hdu 3496 Watch The Movie(二维费用的背包问题)
- HDU 3496 Watch The Movie