动态规划—Problem R

来源:互联网 发布:无主之地2画质优化 编辑:程序博客网 时间:2024/06/06 10:52

动态规划—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;}
0 0