动态规划—Problem R

动态规划—Problem R
题意
题意:给出小猪钱罐的重量和装满钱后的重量,然后是几组数据,每组数据包括每种钱币的价值与重量。要求出重量最少能装满钱罐时的最大价值。
解题思路
完全背包问题。关于完全背包嘛,即在01背包的基础上,每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。
状态转移方程为:
dp[j] = min(dp[j],dp[j-wei[i]]+val[i]).
最后,如果动规数组最后一格数据不等于初始值,即为答案。
感想
最近上课听的有些懵逼,呵呵,完全背包,还需再加深认识与理解。
AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int dp[1000005];

int main()
{
    int t;
    int wa,wb,w;
    int n,val[505],wei[505],i,j;
    cin>>t;
    while(t--)
    {
        cin>>wa>>wb;
        w = wb-wa;//必须减去小猪本身重量
        cin>>n;
        for(i = 0;i<n;i++)
            cin>>val[i]>>wei[i];
        for(i = 0;i<=w;i++)
        {
            dp[i] = 10000000;//因为要求小的,所以dp数组必须存大数
        }
        dp[0] = 0;
        for(i = 0;i<n;i++)
        {
            for(j = wei[i];j<=w;j++)
            {
                dp[j] = min(dp[j],dp[j-wei[i]]+val[i]);
            }
        }
        if(dp[w] == 10000000)
            printf("This is impossible.\n");
        else
            printf("The minimum amount of money in the piggy-bank is %d.\n",dp[w]);
    }

    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hero5201/article/details/51541513
个人分类: ACM 动态规划
上一篇动态规划—Problem G
下一篇动态规划总结
想对作者说点什么? 我来说一句

动态规划Hamming_Problem 解题报告

2012年03月09日 14KB 下载

没有更多推荐了,返回首页

关闭
关闭