Hrbustoj 2252 完全背包

一个变形的完全背包 题是第一次团队赛的热身题...看别人博客看到这道题忽然就不会了 然后想了半天还是没想出来...上oj找了提交排名..发现自己弄出来的奇怪的办法居然用时最短...

问装m最低要多少的v

想法是枚举v 从1开始无限往后 

然后就是普通的完全背包 

一旦dp[k]超过了m 立即break 然后输出v

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    int n,m;
    scanf("%d%d",&n,&m);
    int val[n+1];
    int vol[n+1];
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&vol[i],&val[i]);
    }
    int v;
    for(v=1;;v++)
    {
        int h=0;
        int dp[v+1];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            if(h==1)break;
        for(int k=vol[i];k<=v;k++)
        {
            dp[k]=max(dp[k],dp[k-vol[i]]+val[i]);
            if(dp[k]>=m)
               {
                   h=1;
                   break;
               }
        }
        }
        if(h==1)break;
    }
    printf("%d\n",v);
}
}

  

 

posted @ 2016-02-21 21:37  天翎月  阅读(318)  评论(0编辑  收藏  举报