uva 10163

来源:互联网 发布:linux wine怎么使用 编辑:程序博客网 时间:2024/05/17 09:29

题目大意:m个仓库n个守卫,选出最有方案,一看就是01包,然而在边界条件上我算是载了大跟头,看来设置初始数据和边界条件还是非常有学问,即使状态转移方程没有问题初始值设置的有问题也不行,同时这个两次DP真的是人想出来的吗?我愉快的在求最小费用上wa了好多次!看来自己还是菜啊,真是弱渣。

题目链接:https://vjudge.net/problem/UVA-10163

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define max(a,b) (((a)>(b))?(a):(b))#define min(a,b) (((a)<(b))?(a):(b))using namespace std;const int inf = 0x3f3f3f3f;int cnts , cntm;int v[32];int dp[105][32];int f[105][32];int cmp (int a , int b) {    return a > b;}void solve () {    for (int i = 0 ; i <= cntm ; i++) {        dp[0][i] = inf;    }    for (int i = 1 ; i <= cnts ; i++) {        dp[i][0] = 0;    }    for (int i = 1 ; i <= cnts ; i++) {        for (int j = 1 ; j <= cntm ; j++) {            dp[i][j] = dp[i][j-1];            for (int k = 1 ; k <= i ; k++) {                if(dp[i][j] < min(dp[i-k][j-1],v[j]/k))                     dp[i][j] = min(dp[i-k][j-1],v[j]/k);            }        }    }    for (int i = 0 ; i <= cntm ; i++) {        f[0][i] = 0;    }    for (int i = 1 ; i <= cnts ; i++) {        f[i][0] = inf;    }    for (int i = 1 ; i <= cnts ; i++) {        for (int j = 1 ; j <= cntm ; j++) {            f[i][j] = f[i][j-1];            for (int k = 1 ; k <= i ; k++) {                if (v[j]/k >= dp[cnts][cntm]) {                    f[i][j] = min(f[i][j] , f[i-k][j-1]+v[j]);                    cout << i << " " << j << " " << f[i][j] << endl;                }            }        }    }    f[cnts][cntm] = !dp[cnts][cntm] ? 0 : f[cnts][cntm];    printf ("%d %d\n" , dp[cnts][cntm] , f[cnts][cntm]);}int main () {    while(scanf("%d%d",&cnts,&cntm)) {        if (!cnts && !cntm)            break;        memset(dp,inf,sizeof(dp));        memset(f,0,sizeof(f));        memset(v,0,sizeof(v));        for (int i = 1 ; i <= cntm ; i++)             cin >> v[i];        sort(v+1,v+1+cntm,cmp);        solve();    }}


0 0
原创粉丝点击