当前位置:编程学习 > C/C++ >>

rnqoj-57-找啊找啊找GF-二维背包

简单的二维背包问题。
数组t[j][k]记录时间
数组dp[j][k]记录数量
保证数量的前提下,时间最少
 
#include<stdio.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
#define INF 99999999  
int dp[101][101];  
int t[101][101];  
int main()  
{  
    int a,b,c,i,j,k,n;  
    while(~scanf("%d",&n))  
    {  
        scanf("%d%d%d",&a,&b,&c);  
        for(j=0;j<101;j++)  
        {  
            for(k=0;k<101;k++)t[j][k]=INF;  
        }  
        dp[0][0]=0;  
        t[0][0]=0;  
        dp[a][b]=1;  
        t[a][b]=c;  
        for(i=2;i<=n;i++)  
        {  
            scanf("%d%d%d",&a,&b,&c);  
            for(j=100;j>=a;j--)  
            {  
                for(k=100;k>=b;k--)  
                {  
                    if(dp[j][k]<dp[j-a][k-b]+1)  
                    {  
                        dp[j][k]=dp[j-a][k-b]+1;  
                        t[j][k]=t[j-a][k-b]+c;  
                    }  
                    if(dp[j][k]==dp[j-a][k-b]+1)  
                    {  
                        t[j][k]=min(t[j-a][k-b]+c,t[j][k]);  
                    }  
                }  
            }  
        }  
        scanf("%d%d",&a,&b);  
        int ts,ns;  
        ns=0;ts=99999;  
        for(i=0;i<=a;i++)  
        {  
            for(j=0;j<=b;j++)  
            {  
                if(dp[i][j]>ns)  
                {  
                    ns=dp[i][j];  
                    ts=t[i][j];  
                }  
                else if(dp[i][j]==ns)  
                {  
                    ts=min(ts,t[i][j]);  
                }  
            }  
        }  
        cout<<ts<<endl;  
    }  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,