1. 程式人生 > >P1759 通天之潛水(不詳細,勿看)(動態規劃遞推,組合揹包,洛谷)

P1759 通天之潛水(不詳細,勿看)(動態規劃遞推,組合揹包,洛谷)

題目連結:點選進入

題目分析:

簡單的組合揹包模板題,但是遞推的同時要重新整理這種情況使用了哪些物品

ac程式碼:

#include<bits/stdc++.h>
using namespace std;
int weigh[101],zhu[101],t[101];
struct student
{
    int s;
    int number;
    int a[101];
}f[201][201];
int main()
{
    std::ios::sync_with_stdio(false);
    int m,v,n;//m總重量,v總阻力,n物品數
cin>>m>>v>>n; for(int i=1;i<=n;i++) { cin>>weigh[i]>>zhu[i]>>t[i];//weigh個體重量,zhu個體阻力,t個體價值 } for(int i=1;i<=n;i++) for(int mi=m;mi>=weigh[i];mi--) for(int vi=v;vi>=zhu[i];vi--) {
//printf("\nnumber=%d\n",f[0][0].number); if(f[mi][vi].s<f[mi-weigh[i]][vi-zhu[i]].s+t[i]) { f[mi][vi].s=f[mi-weigh[i]][vi-zhu[i]].s+t[i]; if(f[mi-weigh[i]][vi-zhu[i]].number==0) { f[mi][vi].a[
1]=i; f[mi][vi].number=1; } else { for(int x=1;x<=f[mi-weigh[i]][vi-zhu[i]].number;x++) { f[mi][vi].a[x]=f[mi-weigh[i]][vi-zhu[i]].a[x]; } f[mi][vi].number=f[mi-weigh[i]][vi-zhu[i]].number+1; f[mi][vi].a[f[mi][vi].number]=i; } } } int maxn=f[m][v].s,last_i=m,last_j=v; printf("%d\n",maxn); for(int i=m;i>=0;i--) for(int j=v;j>=0;j--) { if(f[i][j].s!=maxn&&f[last_i][last_j].s==maxn) { for(int x=1;x<=f[last_i][last_j].number;x++) { printf("%d ",f[last_i][last_j].a[x]); } //printf("%d",f[last_i][last_j].number); return 0; } last_i=i;last_j=j; } return 0; }

然後最後在找到相同時間下使用的最少物品情況就好了

 

對於f陣列可以用結構體存,這樣更方便,頂多不好寫,可是思路清晰

 

我對於當前已經存了多少個數是從一開始記,所以用了if,else的分類討論,防止出查錯