zoukankan      html  css  js  c++  java
  • P1060 开心的金明(动态规划背包问题)

    题目描述

    金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的NN元。于是,他把每件物品规定了一个重要度,分为55等:用整数1-51−5表示,第55等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过NN元(可以等于NN元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

    设第jj件物品的价格为v_[j]v[​j],重要度为w_[j]w[​j],共选中了kk件物品,编号依次为j_1,j_2,…,j_kj1​,j2​,…,jk​,则所求的总和为:

    v_[j_1] imes w_[j_1]+v_[j_2] imes w_[j_2]+ …+v_[j_k] imes w_[j_k]v[​j1​]×w[​j1​]+v[​j2​]×w[​j2​]+…+v[​jk​]×w[​jk​]。

    请你帮助金明设计一个满足要求的购物单。

    输入输出格式

    输入格式:

    第一行,为22个正整数,用一个空格隔开:N mNm(其中N(<30000)N(<30000)表示总钱数,m(<25)m(<25)为希望购买物品的个数。)

    从第22行到第m+1m+1行,第jj行给出了编号为j-1j−1的物品的基本数据,每行有22个非负整数v pvp(其中vv表示该物品的价格(v le 10000)(v≤10000),pp表示该物品的重要度(1-51−5)

    输出格式:

    11个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<100000000)(<100000000)。

    输入输出样例

    输入样例#1: 复制

    1000 5
    800 2
    400 5
    300 5
    400 3
    200 2
    

    输出样例#1: 复制

    3900

    题解:动态规划背包问题

    代码:

     #include<cstdio>
     #include<cstring>
     #include<algorithm>
     #include<iostream>
     
     using namespace std;
    
     int main()
     {
     	int n,m;
     	cin>>m>>n;
     	long long int dp[30005];
     	int w[305],v[305];
       for(int t=1;t<=n;t++)
       {
           scanf("%d%d",&v[t],&w[t]);
    	   w[t]*=v[t];	
       }	
       memset(dp,0,sizeof(dp));
      for(int i=1;i<=n;i++)
      {
        for(int j=m;j>=v[i];j--)
        {
            if(j>=v[i])
            dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
       }
       printf("%lld
    ",dp[m]);
     	return 0;
     }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10782057.html
Copyright © 2011-2022 走看看