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

  

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com