首页 > 其他 > 详细

动态规划水题集

时间:2020-03-15 15:29:38      阅读:59      评论:0      收藏:0      [点我收藏+]

目录

对于巨佬而言真的就是水题了,作为一个蒟蒻我还是从水题开始慢慢写吧

hdu 2602 Bone Collector

01背包模板题,用这道题写写01背包的几种写法吧

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int val[maxn];
int pla[maxn];
int dp[maxn][maxn];
int N,V;
void solve()
{
    for (int i=1;i<=N;i++)
    {
        for (int j=0;j<=V;j++)
        {
            if (j>=pla[i])
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-pla[i]]+val[i]);
            else
                dp[i][j]=dp[i-1][j];
        }
    }
}
int choose[maxn];//这个是用来记录选择了哪个物品的
int main()
{
    int T;
    cin>>T;
    while (T--)
    {
        memset(dp,0,sizeof(dp));
        cin>>N>>V;
        for (int i=1;i<=N;i++) cin>>val[i];
        for (int i=1;i<=N;i++) cin>>pla[i];
        solve();
        cout<<dp[N][V]<<endl;//忘了写endl搞了个PE...
        /*int n=N,v=V;这一段就是找寻找物品的,我就注释掉了
        while (dp[n][v])一直循环找选择的物品
        {
            if (dp[n][v]==dp[n-1][v])
                choose[n]=0;
            else
            {
                choose[n]=1;
                v=v-pla[n];开始忘了减...
            }
            n--;
        }
        for (int i=1;i<=N;i++)
            cout<<choose[i]<<" ";*/
    }
    return 0;
}
//滚动数组的代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int val[maxn];
int pla[maxn];
int dp[maxn];
int N,V;
void solve()
{
    for (int i=1;i<=N;i++)
        for (int j=V;j>=pla[i];j--)//最开始还多写了个if来判断j是不是大于pla[i],看了看AC代码发现写一起就行了...还是太弱
                dp[j]=max(dp[j],dp[j-pla[i]]+val[i]);//标准背包状态转移方程
}
int main()
{
    int T;
    cin>>T;
    while (T--)
    {
        memset(dp,0,sizeof(dp));//别忘了清0
        cin>>N>>V;
        for (int i=1;i<=N;i++) cin>>val[i];
        for (int i=1;i<=N;i++) cin>>pla[i];
        solve();
        cout<<dp[V]<<endl;
    }
    return 0;
}

动态规划水题集

原文:https://www.cnblogs.com/Salty-Fish/p/12497499.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!