金明

P1060 开心的金明

心已入冬 提交于 2019-12-14 19:42:27
P1060 开心的金明 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1-5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过NN元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 请你帮助金明设计一个满足要求的购物单。 输入格式 第一行,为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

P1060 开心的金明

匿名 (未验证) 提交于 2019-12-02 23:39:01
01背包 模板题 直接上代码了。。。 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,m,w[30],v[30]; 5 scanf("%d%d",&m,&n); 6 for(int i=1;i<=n;i++){ 7 scanf("%d%d",&w[i],&v[i]); 8 v[i]*=w[i]; 9 } 10 int f[2000][2005]; 11 for(int i=1;i<=n;i++){ 12 for(int c=m;c>=0;c--){ 13 if(w[i]>c){ 14 f[i][c]=f[i-1][c]; 15 }else{ 16 f[i][c]=max(f[i-1][c-w[i]]+v[i],f[i-1][c]); 17 } 18 19 } 20 } 21 cout<<f[n][m]; 22 return 0; 23 }

洛谷 P1064 金明的预算方案

匿名 (未验证) 提交于 2019-12-02 23:30:02
代码: # include <iostream> # include <cstdio> # include <algorithm> # include <iomanip> # include <cstring> # include <string> # include <cmath> # include <stack> # include <queue> # include <vector> # include <set> # include <map> # define ll long long # define mes(x,y); memset(x,y,sizeof(x)) # define mv 2147483648+30 using namespace std ; ll gar ( ll a , ll b ) { //最大公约数 return b == 0 ? a : gar ( b , a % b ) ; } struct node { int price , value , flag , sum ; } z [ 40000 ] , z_fu [ 40000 ] [ 5 ] ; int main ( ) { ll m , n ; while ( cin >> m >> n ) { int dp [ 40000 ] ; mes ( dp , 0 ) ; mes ( z_fu

dp--背包--开心的金明

泄露秘密 提交于 2019-12-02 17:03:52
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 NN N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 NN N元。于是,他把每件物品规定了一个重要度,分为 55 5等:用整数 1−51-5 1 − 5表示,第 55 5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过 NN N元(可以等于 NN N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第 jj j件物品的价格为 v[j]v_[j] v [ ​ j ],重要度为 w[j]w_[j] w [ ​ j ],共选中了 kk k件物品,编号依次为 j1,j2,…,jkj_1,j_2,…,j_k j 1 ​ , j 2 ​ , … , j k ​ ,则所求的总和为: v[j1]×w[j1]+v[j2]×w[j2]+…+v[jk]×w[jk]v_[j_1] \times w_[j_1]+v_[j_2] \times w_[j_2]+ …+v_[j_k] \times w_[j_k] v [ ​ j 1 ​ ] × w [ ​ j 1 ​ ] + v [ ​ j 2 ​ ] × w [ ​ j 2 ​ ] + … + v [ ​

luogu P1064 金明的预算方案

可紊 提交于 2019-11-30 04:31:27
题目描述 题面 luogu P1064 金明的预算方案 题解 定义数组mw,mv分别储存每个主件的重量及价值,fw,fv分别储存每个主件的附件的重量及价值(按输入顺序确定两个附件的顺序); 对于当前状态,有四种选择: 1.只选当前的主件 2.选主件与附件1 3.选主件与附件2 4.选主件与附件1 附件2 那么就是一个很明确的dp方程了 套上01背包模板 输出答案f[N]. Code #include <cstdio> #include <algorithm> #define ll long long using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } const int maxn=32005; int n,m; int mw[maxn],mv[maxn],fw[maxn][3],fv[maxn][3],f[maxn],v,p,q; inline int max(int a,int b){return a>b?a:b;} void init(){

金明的预算方案

孤街浪徒 提交于 2019-11-29 15:45:25
1398. 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件   附件 电脑   打印机,扫描仪 书柜   图书 书桌   台灯,文具 工作椅  无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为: v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk] w[jk]。(其中 为乘号) 请你帮助金明设计一个满足要求的购物单。 输入 输入的第1行,为两个正整数,用一个空格隔开: N m (其中N(<32000)表示总钱数,m(<60

P1064 金明的预算方案

谁都会走 提交于 2019-11-28 03:06:05
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 0个、 1 1个或 2 2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 N N元。于是,他把每件物品规定了一个重要度,分为 5 5等:用整数 1-5 1 − 5表示,第 5 5等最重要。他还从因特网上查到了每件物品的价格(都是 10 1 0元的整数倍)。他希望在不超过 N N元(可以等于 N N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第 j j件物品的价格为 v_[j] v [ ​ j ],重要度为 w_[j] w [ ​ j ],共选中了 k k件物品,编号依次为 j_1,j_2,…,j_k j 1 ​ , j 2 ​ , … , j k ​ ,则所求的总和为: v_[j_1] \times w_[j_1]+v_[j_2] \times w_[j_2]+ …+v_

金明的预算方案

蹲街弑〆低调 提交于 2019-11-27 22:12:13
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0个、 1个或 2 个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 N元。于是,他把每件物品规定了一个重要度,分为 5等:用整数 1-5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第 j j件物品的价格为 v [ ​ j ],重要度为 w [ ​ j ],共选中了 k件物品,编号依次为 j 1 ​ , j 2 ​ , … , j k ​ ,则所求的总和为: v [ ​ j 1 ​ ] × w [ ​ j 1 ​ ] + v [ ​ j 2 ​ ] × w [ ​ j 2 ​ ] + … + v [ ​ j k ​ ] × w [ ​ j k ​ ]。

【题解】p1064 金明的预算方案

若如初见. 提交于 2019-11-27 08:48:09
总结: 1.尝试设计多个状态转移方程 2.这道题记录分组的思想与分组背包由异曲同工之妙 #include<bits/stdc++.h> using namespace std; int dp[32005], val[65], w[65], sum[65], c[65][20], p[65]; int n, m; int main() { cin >> n >> m; for(int i = 1; i <= m; i++) { cin >> w[i] >> val[i] >> p[i]; if(p[i] != 0) { sum[p[i]]++; c[p[i]][sum[p[i]]] = i; } } for(int i = 1; i <= m; i++) for(int j = n; j >= 0; j--) if(p[i] == 0) { if(j >= w[i]) dp[j] = max(dp[j], dp[j-w[i]]+val[i]*w[i]); if(sum[i] > 0) { if(sum[i] == 1) { if(j >= w[i]+w[c[i][1]]) dp[j] = max(dp[j], dp[j-w[i]-w[c[i][1]]]+val[i]*w[i]+val[c[i][1]]*w[c[i][1]]); } if(sum[i] == 2) { if(j >=

P1060 开心的金明

会有一股神秘感。 提交于 2019-11-26 03:23:53
链接 P1060 开心的金明 感想 emmmm就是一维数组要注意一下吧,模版而已 code # include <algorithm> # include <bits/stdc++.h> # include <stdlib.h> # include <stdio.h> # include <iostream> using namespace std ; const int maxn = 1005 ; int dp [ 30000 ] ; struct node { int price ; int value ; } ; node a [ 50 ] ; int n , m ; int main ( ) { # ifdef LOCAL freopen ( "C:\\Users\\hsxny\\Desktop\\in.txt" , "r" , stdin ) ; # endif scanf ( "%d%d" , & m , & n ) ; for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%d%d" , & a [ i ] . price , & a [ i ] . value ) ; } for ( int i = 0 ; i < n ; i ++ ) { for ( int j = m ; j >= a [ i ] . price ; j --