hdu_3127 WHUgirls

本文介绍了一个完全背包问题的解决方法,通过三维动态规划算法来优化求解过程,并详细解释了为何将物品遍历循环置于容量循环内部的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010
struct node{
    int x,y,val;
}s[30];
int dp[N][N];
int main(){
    int t,n,v1,v2;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&v1,&v2);
        for(int i=0;i<n;i++){
            scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].val);
            s[i+n].x=s[i].y;
            s[i+n].y=s[i].x;
            s[i+n].val=s[i].val;
        }
        memset(dp,0,sizeof(dp));
        for(int i=0;i<=v1;i++){
            for(int j=0;j<=v2;j++){
                for(int h=0;h<2*n;h++){
                    int u=s[h].x;
                    int v=s[h].y;
                    if(u<=i&&v<=j)
                        dp[i][j]=max(dp[i][j],max(dp[u][j-v]+dp[i-u][j],dp[i-u][v]+dp[i][j-v])+s[h].val);
                }
            }
        }
        printf("%d\n",dp[v1][v2]);
    }
    return 0;
}
题意很明确,就是完全背包,刚开始对于n的循环写在外面。。一直wrong,还有个问题就是一刀切的方式应该有两种!


对于n这个循环为什么放里面:我刚开始写在外面,是根据二维背包的写法。。。其实这道题是三维的。。。。。


其实很好理解:两维才对应一个物品。。也就是说一个(x,y)才对应一个物品。。x,y是连在一起。。。。就是说选一个物品,x,y要同时改变。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值